rspec-core 3.0.0.beta2 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.yardopts +1 -0
  5. data/Changelog.md +297 -57
  6. data/README.md +16 -13
  7. data/lib/rspec/core.rb +55 -84
  8. data/lib/rspec/core/backport_random.rb +35 -3
  9. data/lib/rspec/core/backtrace_formatter.rb +4 -13
  10. data/lib/rspec/core/configuration.rb +330 -114
  11. data/lib/rspec/core/configuration_options.rb +38 -22
  12. data/lib/rspec/core/drb.rb +111 -0
  13. data/lib/rspec/core/dsl.rb +8 -2
  14. data/lib/rspec/core/example.rb +203 -94
  15. data/lib/rspec/core/example_group.rb +344 -316
  16. data/lib/rspec/core/filter_manager.rb +135 -90
  17. data/lib/rspec/core/flat_map.rb +1 -0
  18. data/lib/rspec/core/formatters.rb +50 -14
  19. data/lib/rspec/core/formatters/base_formatter.rb +32 -138
  20. data/lib/rspec/core/formatters/base_text_formatter.rb +32 -253
  21. data/lib/rspec/core/formatters/console_codes.rb +65 -0
  22. data/lib/rspec/core/formatters/deprecation_formatter.rb +24 -15
  23. data/lib/rspec/core/formatters/documentation_formatter.rb +7 -10
  24. data/lib/rspec/core/formatters/helpers.rb +15 -9
  25. data/lib/rspec/core/formatters/html_formatter.rb +17 -16
  26. data/lib/rspec/core/formatters/html_printer.rb +1 -0
  27. data/lib/rspec/core/formatters/json_formatter.rb +18 -20
  28. data/lib/rspec/core/formatters/profile_formatter.rb +67 -0
  29. data/lib/rspec/core/formatters/progress_formatter.rb +6 -7
  30. data/lib/rspec/core/formatters/snippet_extractor.rb +8 -6
  31. data/lib/rspec/core/hooks.rb +131 -125
  32. data/lib/rspec/core/memoized_helpers.rb +31 -26
  33. data/lib/rspec/core/metadata.rb +277 -184
  34. data/lib/rspec/core/metadata_filter.rb +86 -0
  35. data/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
  36. data/lib/rspec/core/mocking_adapters/flexmock.rb +1 -1
  37. data/lib/rspec/core/mocking_adapters/mocha.rb +1 -1
  38. data/lib/rspec/core/mocking_adapters/null.rb +1 -1
  39. data/lib/rspec/core/mocking_adapters/rr.rb +2 -1
  40. data/lib/rspec/core/mocking_adapters/rspec.rb +1 -1
  41. data/lib/rspec/core/notifications.rb +435 -24
  42. data/lib/rspec/core/option_parser.rb +16 -25
  43. data/lib/rspec/core/ordering.rb +3 -1
  44. data/lib/rspec/core/pending.rb +57 -33
  45. data/lib/rspec/core/project_initializer.rb +2 -0
  46. data/lib/rspec/core/project_initializer/spec_helper.rb +5 -4
  47. data/lib/rspec/core/rake_task.rb +45 -20
  48. data/lib/rspec/core/reporter.rb +50 -22
  49. data/lib/rspec/core/ruby_project.rb +1 -0
  50. data/lib/rspec/core/runner.rb +93 -39
  51. data/lib/rspec/core/shared_context.rb +7 -5
  52. data/lib/rspec/core/shared_example_group.rb +85 -77
  53. data/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
  54. data/lib/rspec/core/version.rb +3 -1
  55. data/lib/rspec/core/warnings.rb +35 -17
  56. data/lib/rspec/core/world.rb +57 -5
  57. metadata +56 -369
  58. metadata.gz.sig +3 -3
  59. data/features/README.md +0 -13
  60. data/features/Upgrade.md +0 -352
  61. data/features/command_line/README.md +0 -25
  62. data/features/command_line/dry_run.feature +0 -29
  63. data/features/command_line/example_name_option.feature +0 -97
  64. data/features/command_line/exit_status.feature +0 -82
  65. data/features/command_line/fail_fast.feature +0 -26
  66. data/features/command_line/format_option.feature +0 -75
  67. data/features/command_line/init.feature +0 -57
  68. data/features/command_line/line_number_appended_to_path.feature +0 -140
  69. data/features/command_line/line_number_option.feature +0 -58
  70. data/features/command_line/order.feature +0 -25
  71. data/features/command_line/pattern_option.feature +0 -49
  72. data/features/command_line/rake_task.feature +0 -122
  73. data/features/command_line/randomization.feature +0 -63
  74. data/features/command_line/require_option.feature +0 -43
  75. data/features/command_line/ruby.feature +0 -23
  76. data/features/command_line/tag.feature +0 -98
  77. data/features/command_line/warnings_option.feature +0 -29
  78. data/features/configuration/alias_example_to.feature +0 -39
  79. data/features/configuration/backtrace_exclusion_patterns.feature +0 -105
  80. data/features/configuration/custom_settings.feature +0 -84
  81. data/features/configuration/default_path.feature +0 -38
  82. data/features/configuration/deprecation_stream.feature +0 -58
  83. data/features/configuration/enable_global_dsl.feature +0 -54
  84. data/features/configuration/fail_fast.feature +0 -77
  85. data/features/configuration/failure_exit_code.feature +0 -36
  86. data/features/configuration/order_and_seed.feature +0 -3
  87. data/features/configuration/output_stream.feature +0 -24
  88. data/features/configuration/overriding_global_ordering.feature +0 -93
  89. data/features/configuration/pattern.feature +0 -38
  90. data/features/configuration/profile.feature +0 -220
  91. data/features/configuration/read_options_from_file.feature +0 -90
  92. data/features/configuration/run_all_when_everything_filtered.feature +0 -76
  93. data/features/example_groups/aliasing.feature +0 -48
  94. data/features/example_groups/basic_structure.feature +0 -55
  95. data/features/example_groups/shared_context.feature +0 -74
  96. data/features/example_groups/shared_examples.feature +0 -286
  97. data/features/expectation_framework_integration/configure_expectation_framework.feature +0 -102
  98. data/features/filtering/exclusion_filters.feature +0 -135
  99. data/features/filtering/if_and_unless.feature +0 -138
  100. data/features/filtering/inclusion_filters.feature +0 -101
  101. data/features/formatters/configurable_colors.feature +0 -31
  102. data/features/formatters/custom_formatter.feature +0 -68
  103. data/features/formatters/json_formatter.feature +0 -30
  104. data/features/formatters/regression_tests.feature +0 -95
  105. data/features/formatters/text_formatter.feature +0 -46
  106. data/features/helper_methods/arbitrary_methods.feature +0 -40
  107. data/features/helper_methods/let.feature +0 -50
  108. data/features/helper_methods/modules.feature +0 -146
  109. data/features/hooks/around_hooks.feature +0 -344
  110. data/features/hooks/before_and_after_hooks.feature +0 -427
  111. data/features/hooks/filtering.feature +0 -232
  112. data/features/metadata/current_example.feature +0 -56
  113. data/features/metadata/described_class.feature +0 -17
  114. data/features/metadata/user_defined.feature +0 -100
  115. data/features/mock_framework_integration/use_any_framework.feature +0 -106
  116. data/features/mock_framework_integration/use_flexmock.feature +0 -94
  117. data/features/mock_framework_integration/use_mocha.feature +0 -95
  118. data/features/mock_framework_integration/use_rr.feature +0 -96
  119. data/features/mock_framework_integration/use_rspec.feature +0 -95
  120. data/features/pending_and_skipped_examples/README.md +0 -3
  121. data/features/pending_and_skipped_examples/pending_examples.feature +0 -118
  122. data/features/pending_and_skipped_examples/skipped_examples.feature +0 -106
  123. data/features/spec_files/arbitrary_file_suffix.feature +0 -13
  124. data/features/step_definitions/additional_cli_steps.rb +0 -83
  125. data/features/subject/explicit_subject.feature +0 -101
  126. data/features/subject/implicit_subject.feature +0 -63
  127. data/features/subject/one_liner_syntax.feature +0 -71
  128. data/features/support/env.rb +0 -21
  129. data/features/support/require_expect_syntax_in_aruba_specs.rb +0 -16
  130. data/features/support/rubinius.rb +0 -6
  131. data/lib/rspec/core/command_line.rb +0 -35
  132. data/lib/rspec/core/drb_command_line.rb +0 -26
  133. data/lib/rspec/core/drb_options.rb +0 -87
  134. data/lib/rspec/core/formatters/legacy_formatter.rb +0 -227
  135. data/lib/rspec/core/shared_example_group/collection.rb +0 -27
  136. data/spec/command_line/order_spec.rb +0 -211
  137. data/spec/rspec/core/backtrace_formatter_spec.rb +0 -230
  138. data/spec/rspec/core/command_line_spec.rb +0 -112
  139. data/spec/rspec/core/command_line_spec_output.txt +0 -0
  140. data/spec/rspec/core/configuration_options_spec.rb +0 -409
  141. data/spec/rspec/core/configuration_spec.rb +0 -1479
  142. data/spec/rspec/core/drb_command_line_spec.rb +0 -102
  143. data/spec/rspec/core/drb_options_spec.rb +0 -193
  144. data/spec/rspec/core/dsl_spec.rb +0 -88
  145. data/spec/rspec/core/example_group_spec.rb +0 -1533
  146. data/spec/rspec/core/example_spec.rb +0 -642
  147. data/spec/rspec/core/filter_manager_spec.rb +0 -229
  148. data/spec/rspec/core/formatters/base_formatter_spec.rb +0 -64
  149. data/spec/rspec/core/formatters/base_text_formatter_spec.rb +0 -303
  150. data/spec/rspec/core/formatters/deprecation_formatter_spec.rb +0 -208
  151. data/spec/rspec/core/formatters/documentation_formatter_spec.rb +0 -75
  152. data/spec/rspec/core/formatters/helpers_spec.rb +0 -104
  153. data/spec/rspec/core/formatters/html_formatted-2.1.0.html +0 -392
  154. data/spec/rspec/core/formatters/html_formatted.html +0 -397
  155. data/spec/rspec/core/formatters/html_formatter_spec.rb +0 -122
  156. data/spec/rspec/core/formatters/json_formatter_spec.rb +0 -206
  157. data/spec/rspec/core/formatters/legacy_formatter_spec.rb +0 -137
  158. data/spec/rspec/core/formatters/progress_formatter_spec.rb +0 -43
  159. data/spec/rspec/core/formatters/snippet_extractor_spec.rb +0 -26
  160. data/spec/rspec/core/formatters_spec.rb +0 -120
  161. data/spec/rspec/core/hooks_filtering_spec.rb +0 -227
  162. data/spec/rspec/core/hooks_spec.rb +0 -294
  163. data/spec/rspec/core/memoized_helpers_spec.rb +0 -495
  164. data/spec/rspec/core/metadata_spec.rb +0 -491
  165. data/spec/rspec/core/option_parser_spec.rb +0 -262
  166. data/spec/rspec/core/ordering_spec.rb +0 -102
  167. data/spec/rspec/core/pending_example_spec.rb +0 -117
  168. data/spec/rspec/core/pending_spec.rb +0 -8
  169. data/spec/rspec/core/project_initializer_spec.rb +0 -73
  170. data/spec/rspec/core/rake_task_spec.rb +0 -146
  171. data/spec/rspec/core/random_spec.rb +0 -47
  172. data/spec/rspec/core/reporter_spec.rb +0 -155
  173. data/spec/rspec/core/resources/a_bar.rb +0 -0
  174. data/spec/rspec/core/resources/a_foo.rb +0 -0
  175. data/spec/rspec/core/resources/a_spec.rb +0 -1
  176. data/spec/rspec/core/resources/custom_example_group_runner.rb +0 -14
  177. data/spec/rspec/core/resources/formatter_specs.rb +0 -58
  178. data/spec/rspec/core/resources/utf8_encoded.rb +0 -8
  179. data/spec/rspec/core/rspec_matchers_spec.rb +0 -45
  180. data/spec/rspec/core/ruby_project_spec.rb +0 -26
  181. data/spec/rspec/core/runner_spec.rb +0 -151
  182. data/spec/rspec/core/shared_context_spec.rb +0 -102
  183. data/spec/rspec/core/shared_example_group/collection_spec.rb +0 -57
  184. data/spec/rspec/core/shared_example_group_spec.rb +0 -114
  185. data/spec/rspec/core/warnings_spec.rb +0 -29
  186. data/spec/rspec/core/world_spec.rb +0 -142
  187. data/spec/rspec/core_spec.rb +0 -91
  188. data/spec/spec_helper.rb +0 -160
  189. data/spec/support/config_options_helper.rb +0 -13
  190. data/spec/support/formatter_support.rb +0 -83
  191. data/spec/support/helper_methods.rb +0 -26
  192. data/spec/support/isolate_load_path_mutation.rb +0 -5
  193. data/spec/support/isolated_directory.rb +0 -10
  194. data/spec/support/isolated_home_directory.rb +0 -16
  195. data/spec/support/legacy_formatter_using_sub_classing_example.rb +0 -87
  196. data/spec/support/matchers.rb +0 -85
  197. data/spec/support/mathn_integration_support.rb +0 -12
  198. data/spec/support/old_style_formatter_example.rb +0 -69
  199. data/spec/support/shared_example_groups.rb +0 -13
  200. data/spec/support/spec_files.rb +0 -44
  201. data/spec/support/stderr_splitter.rb +0 -36
@@ -1,1479 +0,0 @@
1
- require 'spec_helper'
2
- require 'tmpdir'
3
-
4
- module RSpec::Core
5
-
6
- RSpec.describe Configuration do
7
-
8
- let(:config) { Configuration.new }
9
-
10
- describe '#deprecation_stream' do
11
- it 'defaults to standard error' do
12
- expect($rspec_core_without_stderr_monkey_patch.deprecation_stream).to eq STDERR
13
- end
14
-
15
- it 'is configurable' do
16
- io = double 'deprecation io'
17
- config.deprecation_stream = io
18
- expect(config.deprecation_stream).to eq io
19
- end
20
- end
21
-
22
- describe "#output_stream" do
23
- it 'defaults to standard output' do
24
- expect(config.output_stream).to eq $stdout
25
- end
26
-
27
- it 'is configurable' do
28
- io = double 'output io'
29
- config.output_stream = io
30
- expect(config.output_stream).to eq io
31
- end
32
-
33
- context 'when the reporter has already been initialized' do
34
- before do
35
- config.reporter
36
- allow(config).to receive(:warn)
37
- end
38
-
39
- it 'prints a notice indicating the reconfigured output_stream will be ignored' do
40
- config.output_stream = StringIO.new
41
- expect(config).to have_received(:warn).with(/output_stream.*#{__FILE__}:#{__LINE__ - 1}/)
42
- end
43
-
44
- it 'does not change the value of `output_stream`' do
45
- config.output_stream = StringIO.new
46
- expect(config.output_stream).to eq($stdout)
47
- end
48
-
49
- it 'does not print a warning if set to the value it already has' do
50
- config.output_stream = config.output_stream
51
- expect(config).not_to have_received(:warn)
52
- end
53
- end
54
- end
55
-
56
- describe "#requires=" do
57
- include_context "isolate load path mutation"
58
-
59
- def absolute_path_to(dir)
60
- File.expand_path("../../../../#{dir}", __FILE__)
61
- end
62
-
63
- it 'adds `lib` to the load path' do
64
- lib_dir = absolute_path_to("lib")
65
- $LOAD_PATH.delete(lib_dir)
66
-
67
- expect($LOAD_PATH).not_to include(lib_dir)
68
- config.requires = []
69
- expect($LOAD_PATH).to include(lib_dir)
70
- end
71
-
72
- it 'adds the configured `default_path` to the load path' do
73
- config.default_path = 'features'
74
- foo_dir = absolute_path_to("features")
75
-
76
- expect($LOAD_PATH).not_to include(foo_dir)
77
- config.requires = []
78
- expect($LOAD_PATH).to include(foo_dir)
79
- end
80
-
81
- it 'stores the required files' do
82
- expect(config).to receive(:require).with('a/path')
83
- config.requires = ['a/path']
84
- expect(config.requires).to eq ['a/path']
85
- end
86
-
87
- context "when `default_path` refers to a file rather than a directory" do
88
- it 'does not add it to the load path' do
89
- config.default_path = 'Rakefile'
90
- config.requires = []
91
- expect($LOAD_PATH).not_to include(match(/Rakefile/))
92
- end
93
- end
94
- end
95
-
96
- describe "#load_spec_files" do
97
- it "loads files using load" do
98
- config.files_to_run = ["foo.bar", "blah_spec.rb"]
99
- expect(config).to receive(:load).twice
100
- config.load_spec_files
101
- end
102
-
103
- it "loads each file once, even if duplicated in list" do
104
- config.files_to_run = ["a_spec.rb", "a_spec.rb"]
105
- expect(config).to receive(:load).once
106
- config.load_spec_files
107
- end
108
- end
109
-
110
- describe "#mock_framework" do
111
- it "defaults to :rspec" do
112
- expect(config).to receive(:require).with('rspec/core/mocking_adapters/rspec')
113
- config.mock_framework
114
- end
115
- end
116
-
117
- describe "#mock_framework="do
118
- it "delegates to mock_with" do
119
- expect(config).to receive(:mock_with).with(:rspec)
120
- config.mock_framework = :rspec
121
- end
122
- end
123
-
124
- shared_examples "a configurable framework adapter" do |m|
125
- it "yields a config object if the framework_module supports it" do
126
- custom_config = Struct.new(:custom_setting).new
127
- mod = Module.new
128
- allow(mod).to receive_messages(:configuration => custom_config)
129
-
130
- config.send m, mod do |mod_config|
131
- mod_config.custom_setting = true
132
- end
133
-
134
- expect(custom_config.custom_setting).to be_truthy
135
- end
136
-
137
- it "raises if framework module doesn't support configuration" do
138
- mod = Module.new
139
-
140
- expect {
141
- config.send m, mod do |mod_config|
142
- end
143
- }.to raise_error(/must respond to `configuration`/)
144
- end
145
- end
146
-
147
- describe "#mock_with" do
148
- before { allow(config).to receive(:require) }
149
-
150
- it_behaves_like "a configurable framework adapter", :mock_with
151
-
152
- it "allows rspec-mocks to be configured with a provided block" do
153
- mod = Module.new
154
-
155
- expect(RSpec::Mocks.configuration).to receive(:add_stub_and_should_receive_to).with(mod)
156
-
157
- config.mock_with :rspec do |c|
158
- c.add_stub_and_should_receive_to mod
159
- end
160
- end
161
-
162
- context "with a module" do
163
- it "sets the mock_framework_adapter to that module" do
164
- mod = Module.new
165
- config.mock_with mod
166
- expect(config.mock_framework).to eq(mod)
167
- end
168
- end
169
-
170
- it 'uses the named adapter' do
171
- expect(config).to receive(:require).with("rspec/core/mocking_adapters/mocha")
172
- stub_const("RSpec::Core::MockingAdapters::Mocha", Module.new)
173
- config.mock_with :mocha
174
- end
175
-
176
- it "uses the null adapter when given :nothing" do
177
- expect(config).to receive(:require).with('rspec/core/mocking_adapters/null').and_call_original
178
- config.mock_with :nothing
179
- end
180
-
181
- it "raises an error when given an unknown key" do
182
- expect {
183
- config.mock_with :crazy_new_mocking_framework_ive_not_yet_heard_of
184
- }.to raise_error(ArgumentError, /unknown mocking framework/i)
185
- end
186
-
187
- it "raises an error when given another type of object" do
188
- expect {
189
- config.mock_with Object.new
190
- }.to raise_error(ArgumentError, /unknown mocking framework/i)
191
- end
192
-
193
- context 'when there are already some example groups defined' do
194
- it 'raises an error since this setting must be applied before any groups are defined' do
195
- allow(RSpec.world).to receive(:example_groups).and_return([double.as_null_object])
196
- stub_const("RSpec::Core::MockingAdapters::Mocha", double(:framework_name => :mocha))
197
- expect {
198
- config.mock_with :mocha
199
- }.to raise_error(/must be configured before any example groups are defined/)
200
- end
201
-
202
- it 'does not raise an error if the default `mock_with :rspec` is re-configured' do
203
- config.mock_framework # called by RSpec when configuring the first example group
204
- allow(RSpec.world).to receive(:example_groups).and_return([double.as_null_object])
205
- config.mock_with :rspec
206
- end
207
-
208
- it 'does not raise an error if re-setting the same config' do
209
- stub_const("RSpec::Core::MockingAdapters::Mocha", double(:framework_name => :mocha))
210
- groups = []
211
- allow(RSpec.world).to receive_messages(:example_groups => groups)
212
- config.mock_with :mocha
213
- groups << double.as_null_object
214
- config.mock_with :mocha
215
- end
216
- end
217
- end
218
-
219
- describe "#expectation_framework" do
220
- it "defaults to :rspec" do
221
- expect(config).to receive(:require).with('rspec/expectations')
222
- config.expectation_frameworks
223
- end
224
- end
225
-
226
- describe "#expectation_framework=" do
227
- it "delegates to expect_with=" do
228
- expect(config).to receive(:expect_with).with(:rspec)
229
- config.expectation_framework = :rspec
230
- end
231
- end
232
-
233
- describe "#expect_with" do
234
- before do
235
- stub_const("Test::Unit::Assertions", Module.new)
236
- allow(config).to receive(:require)
237
- end
238
-
239
- it_behaves_like "a configurable framework adapter", :expect_with
240
-
241
- [
242
- [:rspec, 'rspec/expectations'],
243
- [:stdlib, 'test/unit/assertions']
244
- ].each do |framework, required_file|
245
- context "with #{framework}" do
246
- it "requires #{required_file}" do
247
- expect(config).to receive(:require).with(required_file)
248
- config.expect_with framework
249
- end
250
- end
251
- end
252
-
253
- it "supports multiple calls" do
254
- config.expect_with :rspec
255
- config.expect_with :stdlib
256
- expect(config.expectation_frameworks).to eq [RSpec::Matchers, Test::Unit::Assertions]
257
- end
258
-
259
- it "raises if block given with multiple args" do
260
- expect {
261
- config.expect_with :rspec, :stdlib do |mod_config|
262
- end
263
- }.to raise_error(/expect_with only accepts/)
264
- end
265
-
266
- it "raises ArgumentError if framework is not supported" do
267
- expect do
268
- config.expect_with :not_supported
269
- end.to raise_error(ArgumentError)
270
- end
271
-
272
- context 'when there are already some example groups defined' do
273
- it 'raises an error since this setting must be applied before any groups are defined' do
274
- allow(RSpec.world).to receive(:example_groups).and_return([double.as_null_object])
275
- expect {
276
- config.expect_with :rspec
277
- }.to raise_error(/must be configured before any example groups are defined/)
278
- end
279
-
280
- it 'does not raise an error if the default `expect_with :rspec` is re-configured' do
281
- config.expectation_frameworks # called by RSpec when configuring the first example group
282
- allow(RSpec.world).to receive(:example_groups).and_return([double.as_null_object])
283
- config.expect_with :rspec
284
- end
285
-
286
- it 'does not raise an error if re-setting the same config' do
287
- groups = []
288
- allow(RSpec.world).to receive_messages(:example_groups => groups)
289
- config.expect_with :stdlib
290
- groups << double.as_null_object
291
- config.expect_with :stdlib
292
- end
293
- end
294
- end
295
-
296
- describe "#expecting_with_rspec?" do
297
- before do
298
- stub_const("Test::Unit::Assertions", Module.new)
299
- allow(config).to receive(:require)
300
- end
301
-
302
- it "returns false by default" do
303
- expect(config).not_to be_expecting_with_rspec
304
- end
305
-
306
- it "returns true when `expect_with :rspec` has been configured" do
307
- config.expect_with :rspec
308
- expect(config).to be_expecting_with_rspec
309
- end
310
-
311
- it "returns true when `expect_with :rspec, :stdlib` has been configured" do
312
- config.expect_with :rspec, :stdlib
313
- expect(config).to be_expecting_with_rspec
314
- end
315
-
316
- it "returns true when `expect_with :stdlib, :rspec` has been configured" do
317
- config.expect_with :stdlib, :rspec
318
- expect(config).to be_expecting_with_rspec
319
- end
320
-
321
- it "returns false when `expect_with :stdlib` has been configured" do
322
- config.expect_with :stdlib
323
- expect(config).not_to be_expecting_with_rspec
324
- end
325
- end
326
-
327
- describe "#files_to_run" do
328
- it "loads files not following pattern if named explicitly" do
329
- assign_files_or_directories_to_run "spec/rspec/core/resources/a_bar.rb"
330
- expect(config.files_to_run).to eq([ "spec/rspec/core/resources/a_bar.rb"])
331
- end
332
-
333
- it "prevents repetition of dir when start of the pattern" do
334
- config.pattern = "spec/**/a_spec.rb"
335
- assign_files_or_directories_to_run "spec"
336
- expect(config.files_to_run).to eq(["spec/rspec/core/resources/a_spec.rb"])
337
- end
338
-
339
- it "does not prevent repetition of dir when later of the pattern" do
340
- config.pattern = "rspec/**/a_spec.rb"
341
- assign_files_or_directories_to_run "spec"
342
- expect(config.files_to_run).to eq(["spec/rspec/core/resources/a_spec.rb"])
343
- end
344
-
345
- it 'reloads when `files_or_directories_to_run` is reassigned' do
346
- config.pattern = "spec/**/a_spec.rb"
347
- config.files_or_directories_to_run = "empty_dir"
348
-
349
- expect {
350
- config.files_or_directories_to_run = "spec"
351
- }.to change { config.files_to_run }.
352
- to(["spec/rspec/core/resources/a_spec.rb"])
353
- end
354
-
355
- context "with <path>:<line_number>" do
356
- it "overrides inclusion filters set on config" do
357
- config.filter_run_including :foo => :bar
358
- assign_files_or_directories_to_run "path/to/file.rb:37"
359
- expect(config.inclusion_filter.size).to eq(1)
360
- expect(config.inclusion_filter[:locations].keys.first).to match(/path\/to\/file\.rb$/)
361
- expect(config.inclusion_filter[:locations].values.first).to eq([37])
362
- end
363
-
364
- it "overrides inclusion filters set before config" do
365
- config.force(:inclusion_filter => {:foo => :bar})
366
- assign_files_or_directories_to_run "path/to/file.rb:37"
367
- expect(config.inclusion_filter.size).to eq(1)
368
- expect(config.inclusion_filter[:locations].keys.first).to match(/path\/to\/file\.rb$/)
369
- expect(config.inclusion_filter[:locations].values.first).to eq([37])
370
- end
371
-
372
- it "clears exclusion filters set on config" do
373
- config.exclusion_filter = { :foo => :bar }
374
- assign_files_or_directories_to_run "path/to/file.rb:37"
375
- expect(config.exclusion_filter).to be_empty,
376
- "expected exclusion filter to be empty:\n#{config.exclusion_filter}"
377
- end
378
-
379
- it "clears exclusion filters set before config" do
380
- config.force(:exclusion_filter => { :foo => :bar })
381
- assign_files_or_directories_to_run "path/to/file.rb:37"
382
- expect(config.exclusion_filter).to be_empty,
383
- "expected exclusion filter to be empty:\n#{config.exclusion_filter}"
384
- end
385
- end
386
-
387
- context "with default pattern" do
388
- it "loads files named _spec.rb" do
389
- assign_files_or_directories_to_run "spec/rspec/core/resources"
390
- expect(config.files_to_run).to eq([ "spec/rspec/core/resources/a_spec.rb"])
391
- end
392
-
393
- it "loads files in Windows", :if => RSpec.windows_os? do
394
- assign_files_or_directories_to_run "C:\\path\\to\\project\\spec\\sub\\foo_spec.rb"
395
- expect(config.files_to_run).to eq([ "C:/path/to/project/spec/sub/foo_spec.rb"])
396
- end
397
-
398
- it "loads files in Windows when directory is specified", :if => RSpec.windows_os? do
399
- assign_files_or_directories_to_run "spec\\rspec\\core\\resources"
400
- expect(config.files_to_run).to eq([ "spec/rspec/core/resources/a_spec.rb"])
401
- end
402
- end
403
-
404
- context "with default default_path" do
405
- it "loads files in the default path when run by rspec" do
406
- allow(config).to receive(:command) { 'rspec' }
407
- assign_files_or_directories_to_run []
408
- expect(config.files_to_run).not_to be_empty
409
- end
410
-
411
- it "loads files in the default path when run with DRB (e.g., spork)" do
412
- allow(config).to receive(:command) { 'spork' }
413
- allow(RSpec::Core::Runner).to receive(:running_in_drb?) { true }
414
- assign_files_or_directories_to_run []
415
- expect(config.files_to_run).not_to be_empty
416
- end
417
-
418
- it "does not load files in the default path when run by ruby" do
419
- allow(config).to receive(:command) { 'ruby' }
420
- assign_files_or_directories_to_run []
421
- expect(config.files_to_run).to be_empty
422
- end
423
- end
424
-
425
- def specify_consistent_ordering_of_files_to_run
426
- allow(File).to receive(:directory?).with('a') { true }
427
- globbed_files = nil
428
- allow(Dir).to receive(:[]).with(/^\{?a/) { globbed_files }
429
-
430
- orderings = [
431
- %w[ a/1.rb a/2.rb a/3.rb ],
432
- %w[ a/2.rb a/1.rb a/3.rb ],
433
- %w[ a/3.rb a/2.rb a/1.rb ]
434
- ].map do |files|
435
- globbed_files = files
436
- yield
437
- config.files_to_run
438
- end
439
-
440
- expect(orderings.uniq.size).to eq(1)
441
- end
442
-
443
- context 'when the given directories match the pattern' do
444
- it 'orders the files in a consistent ordering, regardless of the underlying OS ordering' do
445
- specify_consistent_ordering_of_files_to_run do
446
- config.pattern = 'a/*.rb'
447
- assign_files_or_directories_to_run 'a'
448
- end
449
- end
450
- end
451
-
452
- context 'when the pattern is given relative to the given directories' do
453
- it 'orders the files in a consistent ordering, regardless of the underlying OS ordering' do
454
- specify_consistent_ordering_of_files_to_run do
455
- config.pattern = '*.rb'
456
- assign_files_or_directories_to_run 'a'
457
- end
458
- end
459
- end
460
-
461
- context 'when given multiple file paths' do
462
- it 'orders the files in a consistent ordering, regardless of the given order' do
463
- allow(File).to receive(:directory?) { false } # fake it into thinking these a full file paths
464
-
465
- files = ['a/b/c_spec.rb', 'c/b/a_spec.rb']
466
- assign_files_or_directories_to_run(*files)
467
- ordering_1 = config.files_to_run
468
-
469
- assign_files_or_directories_to_run(*files.reverse)
470
- ordering_2 = config.files_to_run
471
-
472
- expect(ordering_1).to eq(ordering_2)
473
- end
474
- end
475
- end
476
-
477
- %w[pattern= filename_pattern=].each do |setter|
478
- describe "##{setter}" do
479
- context "with single pattern" do
480
- before { config.send(setter, "**/*_foo.rb") }
481
- it "loads files following pattern" do
482
- file = File.expand_path(File.dirname(__FILE__) + "/resources/a_foo.rb")
483
- assign_files_or_directories_to_run file
484
- expect(config.files_to_run).to include(file)
485
- end
486
-
487
- it "loads files in directories following pattern" do
488
- dir = File.expand_path(File.dirname(__FILE__) + "/resources")
489
- assign_files_or_directories_to_run dir
490
- expect(config.files_to_run).to include("#{dir}/a_foo.rb")
491
- end
492
-
493
- it "does not load files in directories not following pattern" do
494
- dir = File.expand_path(File.dirname(__FILE__) + "/resources")
495
- assign_files_or_directories_to_run dir
496
- expect(config.files_to_run).not_to include("#{dir}/a_bar.rb")
497
- end
498
- end
499
-
500
- context "with multiple patterns" do
501
- it "supports comma separated values" do
502
- config.send(setter, "**/*_foo.rb,**/*_bar.rb")
503
- dir = File.expand_path(File.dirname(__FILE__) + "/resources")
504
- assign_files_or_directories_to_run dir
505
- expect(config.files_to_run).to include("#{dir}/a_foo.rb")
506
- expect(config.files_to_run).to include("#{dir}/a_bar.rb")
507
- end
508
-
509
- it "supports comma separated values with spaces" do
510
- config.send(setter, "**/*_foo.rb, **/*_bar.rb")
511
- dir = File.expand_path(File.dirname(__FILE__) + "/resources")
512
- assign_files_or_directories_to_run dir
513
- expect(config.files_to_run).to include("#{dir}/a_foo.rb")
514
- expect(config.files_to_run).to include("#{dir}/a_bar.rb")
515
- end
516
-
517
- it "supports curly braces glob syntax" do
518
- config.send(setter, "**/*_{foo,bar}.rb")
519
- dir = File.expand_path(File.dirname(__FILE__) + "/resources")
520
- assign_files_or_directories_to_run dir
521
- expect(config.files_to_run).to include("#{dir}/a_foo.rb")
522
- expect(config.files_to_run).to include("#{dir}/a_bar.rb")
523
- end
524
- end
525
-
526
- context "after files have already been loaded" do
527
- it 'will warn that it will have no effect' do
528
- expect_warning_with_call_site(__FILE__, __LINE__ + 2, /has no effect/)
529
- config.load_spec_files
530
- config.send(setter, "rspec/**/*.spec")
531
- end
532
-
533
- it 'will not warn if reset is called after load_spec_files' do
534
- config.load_spec_files
535
- config.reset
536
- expect(RSpec).to_not receive(:warning)
537
- config.send(setter, "rspec/**/*.spec")
538
- end
539
- end
540
- end
541
- end
542
-
543
- describe "path with line number" do
544
- it "assigns the line number as a location filter" do
545
- assign_files_or_directories_to_run "path/to/a_spec.rb:37"
546
- expect(config.filter).to eq({:locations => {File.expand_path("path/to/a_spec.rb") => [37]}})
547
- end
548
- end
549
-
550
- context "with full_description set" do
551
- it "overrides filters" do
552
- config.filter_run :focused => true
553
- config.full_description = "foo"
554
- expect(config.filter).not_to have_key(:focused)
555
- end
556
-
557
- it 'is possible to access the full description regular expression' do
558
- config.full_description = "foo"
559
- expect(config.full_description).to eq(/foo/)
560
- end
561
- end
562
-
563
- context "without full_description having been set" do
564
- it 'returns nil from #full_description' do
565
- expect(config.full_description).to eq nil
566
- end
567
- end
568
-
569
- context "with line number" do
570
- it "assigns the file and line number as a location filter" do
571
- assign_files_or_directories_to_run "path/to/a_spec.rb:37"
572
- expect(config.filter).to eq({:locations => {File.expand_path("path/to/a_spec.rb") => [37]}})
573
- end
574
-
575
- it "assigns multiple files with line numbers as location filters" do
576
- assign_files_or_directories_to_run "path/to/a_spec.rb:37", "other_spec.rb:44"
577
- expect(config.filter).to eq({:locations => {File.expand_path("path/to/a_spec.rb") => [37],
578
- File.expand_path("other_spec.rb") => [44]}})
579
- end
580
-
581
- it "assigns files with multiple line numbers as location filters" do
582
- assign_files_or_directories_to_run "path/to/a_spec.rb:37", "path/to/a_spec.rb:44"
583
- expect(config.filter).to eq({:locations => {File.expand_path("path/to/a_spec.rb") => [37, 44]}})
584
- end
585
- end
586
-
587
- context "with multiple line numbers" do
588
- it "assigns the file and line numbers as a location filter" do
589
- assign_files_or_directories_to_run "path/to/a_spec.rb:1:3:5:7"
590
- expect(config.filter).to eq({:locations => {File.expand_path("path/to/a_spec.rb") => [1,3,5,7]}})
591
- end
592
- end
593
-
594
- it "assigns the example name as the filter on description" do
595
- config.full_description = "foo"
596
- expect(config.filter).to eq({:full_description => /foo/})
597
- end
598
-
599
- it "assigns the example names as the filter on description if description is an array" do
600
- config.full_description = [ "foo", "bar" ]
601
- expect(config.filter).to eq({:full_description => Regexp.union(/foo/, /bar/)})
602
- end
603
-
604
- it 'is possible to access the full description regular expression' do
605
- config.full_description = "foo","bar"
606
- expect(config.full_description).to eq Regexp.union(/foo/,/bar/)
607
- end
608
-
609
- describe "#default_path" do
610
- it 'defaults to "spec"' do
611
- expect(config.default_path).to eq('spec')
612
- end
613
- end
614
-
615
- describe "#include" do
616
-
617
- module InstanceLevelMethods
618
- def you_call_this_a_blt?
619
- "egad man, where's the mayo?!?!?"
620
- end
621
- end
622
-
623
- it_behaves_like "metadata hash builder" do
624
- def metadata_hash(*args)
625
- config.include(InstanceLevelMethods, *args)
626
- config.include_or_extend_modules.last.last
627
- end
628
- end
629
-
630
- context "with no filter" do
631
- it "includes the given module into each example group" do
632
- RSpec.configure do |c|
633
- c.include(InstanceLevelMethods)
634
- end
635
-
636
- group = ExampleGroup.describe('does like, stuff and junk', :magic_key => :include) { }
637
- expect(group).not_to respond_to(:you_call_this_a_blt?)
638
- expect(group.new.you_call_this_a_blt?).to eq("egad man, where's the mayo?!?!?")
639
- end
640
- end
641
-
642
- context "with a filter" do
643
- it "includes the given module into each matching example group" do
644
- RSpec.configure do |c|
645
- c.include(InstanceLevelMethods, :magic_key => :include)
646
- end
647
-
648
- group = ExampleGroup.describe('does like, stuff and junk', :magic_key => :include) { }
649
- expect(group).not_to respond_to(:you_call_this_a_blt?)
650
- expect(group.new.you_call_this_a_blt?).to eq("egad man, where's the mayo?!?!?")
651
- end
652
- end
653
-
654
- end
655
-
656
- describe "#extend" do
657
-
658
- module ThatThingISentYou
659
- def that_thing
660
- end
661
- end
662
-
663
- it_behaves_like "metadata hash builder" do
664
- def metadata_hash(*args)
665
- config.extend(ThatThingISentYou, *args)
666
- config.include_or_extend_modules.last.last
667
- end
668
- end
669
-
670
- it "extends the given module into each matching example group" do
671
- RSpec.configure do |c|
672
- c.extend(ThatThingISentYou, :magic_key => :extend)
673
- end
674
-
675
- group = ExampleGroup.describe(ThatThingISentYou, :magic_key => :extend) { }
676
- expect(group).to respond_to(:that_thing)
677
- end
678
-
679
- end
680
-
681
- describe "#run_all_when_everything_filtered?" do
682
-
683
- it "defaults to false" do
684
- expect(config.run_all_when_everything_filtered?).to be_falsey
685
- end
686
-
687
- it "can be queried with question method" do
688
- config.run_all_when_everything_filtered = true
689
- expect(config.run_all_when_everything_filtered?).to be_truthy
690
- end
691
- end
692
-
693
- %w[color color_enabled].each do |color_option|
694
- describe "##{color_option}=" do
695
- context "given true" do
696
- before { config.send "#{color_option}=", true }
697
-
698
- context "with config.tty? and output.tty?" do
699
- it "does not set color_enabled" do
700
- output = StringIO.new
701
- config.output_stream = output
702
-
703
- config.tty = true
704
- allow(config.output_stream).to receive_messages :tty? => true
705
-
706
- expect(config.send(color_option)).to be_truthy
707
- expect(config.send(color_option, output)).to be_truthy
708
- end
709
- end
710
-
711
- context "with config.tty? and !output.tty?" do
712
- it "sets color_enabled" do
713
- output = StringIO.new
714
- config.output_stream = output
715
-
716
- config.tty = true
717
- allow(config.output_stream).to receive_messages :tty? => false
718
-
719
- expect(config.send(color_option)).to be_truthy
720
- expect(config.send(color_option, output)).to be_truthy
721
- end
722
- end
723
-
724
- context "with config.tty? and !output.tty?" do
725
- it "does not set color_enabled" do
726
- output = StringIO.new
727
- config.output_stream = output
728
-
729
- config.tty = false
730
- allow(config.output_stream).to receive_messages :tty? => true
731
-
732
- expect(config.send(color_option)).to be_truthy
733
- expect(config.send(color_option, output)).to be_truthy
734
- end
735
- end
736
-
737
- context "with !config.tty? and !output.tty?" do
738
- it "does not set color_enabled" do
739
- output = StringIO.new
740
- config.output_stream = output
741
-
742
- config.tty = false
743
- allow(config.output_stream).to receive_messages :tty? => false
744
-
745
- expect(config.send(color_option)).to be_falsey
746
- expect(config.send(color_option, output)).to be_falsey
747
- end
748
- end
749
-
750
- context "on windows" do
751
- before do
752
- @original_host = RbConfig::CONFIG['host_os']
753
- RbConfig::CONFIG['host_os'] = 'mingw'
754
- allow(config).to receive(:require)
755
- end
756
-
757
- after do
758
- RbConfig::CONFIG['host_os'] = @original_host
759
- end
760
-
761
- context "with ANSICON available" do
762
- around(:each) { |e| with_env_vars('ANSICON' => 'ANSICON', &e) }
763
-
764
- it "enables colors" do
765
- config.output_stream = StringIO.new
766
- allow(config.output_stream).to receive_messages :tty? => true
767
- config.send "#{color_option}=", true
768
- expect(config.send(color_option)).to be_truthy
769
- end
770
-
771
- it "leaves output stream intact" do
772
- config.output_stream = $stdout
773
- allow(config).to receive(:require) do |what|
774
- config.output_stream = 'foo' if what =~ /Win32/
775
- end
776
- config.send "#{color_option}=", true
777
- expect(config.output_stream).to eq($stdout)
778
- end
779
- end
780
-
781
- context "with ANSICON NOT available" do
782
- before do
783
- allow_warning
784
- end
785
-
786
- it "warns to install ANSICON" do
787
- allow(config).to receive(:require) { raise LoadError }
788
- expect_warning_with_call_site(__FILE__, __LINE__ + 1, /You must use ANSICON/)
789
- config.send "#{color_option}=", true
790
- end
791
-
792
- it "sets color_enabled to false" do
793
- allow(config).to receive(:require) { raise LoadError }
794
- config.send "#{color_option}=", true
795
- config.color_enabled = true
796
- expect(config.send(color_option)).to be_falsey
797
- end
798
- end
799
- end
800
- end
801
- end
802
-
803
- it "prefers incoming cli_args" do
804
- config.output_stream = StringIO.new
805
- allow(config.output_stream).to receive_messages :tty? => true
806
- config.force :color => true
807
- config.color = false
808
- expect(config.color).to be_truthy
809
- end
810
- end
811
-
812
- %w[formatter= add_formatter].each do |config_method|
813
- describe "##{config_method}" do
814
- it "delegates to formatters#add" do
815
- expect(config.formatter_loader).to receive(:add).with('these','options')
816
- config.send(config_method,'these','options')
817
- end
818
- end
819
- end
820
-
821
- describe "#filter_run_including" do
822
- it_behaves_like "metadata hash builder" do
823
- def metadata_hash(*args)
824
- config.filter_run_including(*args)
825
- config.inclusion_filter
826
- end
827
- end
828
-
829
- it "sets the filter with a hash" do
830
- config.filter_run_including :foo => true
831
- expect(config.inclusion_filter[:foo]).to be(true)
832
- end
833
-
834
- it "sets the filter with a symbol" do
835
- config.filter_run_including :foo
836
- expect(config.inclusion_filter[:foo]).to be(true)
837
- end
838
-
839
- it "merges with existing filters" do
840
- config.filter_run_including :foo => true
841
- config.filter_run_including :bar => false
842
-
843
- expect(config.inclusion_filter[:foo]).to be(true)
844
- expect(config.inclusion_filter[:bar]).to be(false)
845
- end
846
- end
847
-
848
- describe "#filter_run_excluding" do
849
- it_behaves_like "metadata hash builder" do
850
- def metadata_hash(*args)
851
- config.filter_run_excluding(*args)
852
- config.exclusion_filter
853
- end
854
- end
855
-
856
- it "sets the filter" do
857
- config.filter_run_excluding :foo => true
858
- expect(config.exclusion_filter[:foo]).to be(true)
859
- end
860
-
861
- it "sets the filter using a symbol" do
862
- config.filter_run_excluding :foo
863
- expect(config.exclusion_filter[:foo]).to be(true)
864
- end
865
-
866
- it "merges with existing filters" do
867
- config.filter_run_excluding :foo => true
868
- config.filter_run_excluding :bar => false
869
-
870
- expect(config.exclusion_filter[:foo]).to be(true)
871
- expect(config.exclusion_filter[:bar]).to be(false)
872
- end
873
- end
874
-
875
- describe "#inclusion_filter" do
876
- it "returns {} even if set to nil" do
877
- config.inclusion_filter = nil
878
- expect(config.inclusion_filter).to eq({})
879
- end
880
- end
881
-
882
- describe "#inclusion_filter=" do
883
- it "treats symbols as hash keys with true values when told to" do
884
- config.inclusion_filter = :foo
885
- expect(config.inclusion_filter).to eq({:foo => true})
886
- end
887
-
888
- it "overrides any inclusion filters set on the command line or in configuration files" do
889
- config.force(:inclusion_filter => { :foo => :bar })
890
- config.inclusion_filter = {:want => :this}
891
- expect(config.inclusion_filter).to eq({:want => :this})
892
- end
893
- end
894
-
895
- describe "#exclusion_filter" do
896
- it "returns {} even if set to nil" do
897
- config.exclusion_filter = nil
898
- expect(config.exclusion_filter).to eq({})
899
- end
900
-
901
- describe "the default :if filter" do
902
- it "does not exclude a spec with { :if => true } metadata" do
903
- expect(config.exclusion_filter[:if].call(true)).to be_falsey
904
- end
905
-
906
- it "excludes a spec with { :if => false } metadata" do
907
- expect(config.exclusion_filter[:if].call(false)).to be_truthy
908
- end
909
-
910
- it "excludes a spec with { :if => nil } metadata" do
911
- expect(config.exclusion_filter[:if].call(nil)).to be_truthy
912
- end
913
- end
914
-
915
- describe "the default :unless filter" do
916
- it "excludes a spec with { :unless => true } metadata" do
917
- expect(config.exclusion_filter[:unless].call(true)).to be_truthy
918
- end
919
-
920
- it "does not exclude a spec with { :unless => false } metadata" do
921
- expect(config.exclusion_filter[:unless].call(false)).to be_falsey
922
- end
923
-
924
- it "does not exclude a spec with { :unless => nil } metadata" do
925
- expect(config.exclusion_filter[:unless].call(nil)).to be_falsey
926
- end
927
- end
928
- end
929
-
930
- describe "#treat_symbols_as_metadata_keys_with_true_values=" do
931
- it 'is deprecated' do
932
- expect_deprecation_with_call_site(__FILE__, __LINE__ + 1)
933
- config.treat_symbols_as_metadata_keys_with_true_values = true
934
- end
935
- end
936
-
937
- describe "#exclusion_filter=" do
938
- it "treats symbols as hash keys with true values when told to" do
939
- config.exclusion_filter = :foo
940
- expect(config.exclusion_filter).to eq({:foo => true})
941
- end
942
-
943
- it "overrides any exclusion filters set on the command line or in configuration files" do
944
- config.force(:exclusion_filter => { :foo => :bar })
945
- config.exclusion_filter = {:want => :this}
946
- expect(config.exclusion_filter).to eq({:want => :this})
947
- end
948
- end
949
-
950
- describe "line_numbers=" do
951
- it "sets the line numbers" do
952
- config.line_numbers = ['37']
953
- expect(config.filter).to eq({:line_numbers => [37]})
954
- end
955
-
956
- it "overrides filters" do
957
- config.filter_run :focused => true
958
- config.line_numbers = ['37']
959
- expect(config.filter).to eq({:line_numbers => [37]})
960
- end
961
-
962
- it "prevents subsequent filters" do
963
- config.line_numbers = ['37']
964
- config.filter_run :focused => true
965
- expect(config.filter).to eq({:line_numbers => [37]})
966
- end
967
- end
968
-
969
- describe "line_numbers" do
970
- it "returns the line numbers from the filter" do
971
- config.line_numbers = ['42']
972
- expect(config.line_numbers).to eq [42]
973
- end
974
-
975
- it "defaults to empty" do
976
- expect(config.line_numbers).to eq []
977
- end
978
- end
979
-
980
- describe "#full_backtrace=" do
981
- it "doesn't impact other instances of config" do
982
- config_1 = Configuration.new
983
- config_2 = Configuration.new
984
-
985
- config_1.full_backtrace = true
986
- expect(config_2.full_backtrace?).to be_falsey
987
- end
988
- end
989
-
990
- describe "#backtrace_exclusion_patterns=" do
991
- it "actually receives the new filter values" do
992
- config = Configuration.new
993
- config.backtrace_exclusion_patterns = [/.*/]
994
- expect(config.backtrace_formatter.exclude? "this").to be_truthy
995
- end
996
- end
997
-
998
- describe 'full_backtrace' do
999
- it 'returns true when backtrace patterns is empty' do
1000
- config.backtrace_exclusion_patterns = []
1001
- expect(config.full_backtrace?).to eq true
1002
- end
1003
-
1004
- it 'returns false when backtrace patterns isnt empty' do
1005
- config.backtrace_exclusion_patterns = [:lib]
1006
- expect(config.full_backtrace?).to eq false
1007
- end
1008
- end
1009
-
1010
- describe "#backtrace_exclusion_patterns" do
1011
- it "can be appended to" do
1012
- config = Configuration.new
1013
- config.backtrace_exclusion_patterns << /.*/
1014
- expect(config.backtrace_formatter.exclude? "this").to be_truthy
1015
- end
1016
- end
1017
-
1018
- describe "#libs=" do
1019
- include_context "isolate load path mutation"
1020
-
1021
- it "adds directories to the LOAD_PATH" do
1022
- expect($LOAD_PATH).to receive(:unshift).with("a/dir")
1023
- config.libs = ["a/dir"]
1024
- end
1025
- end
1026
-
1027
- describe "libs" do
1028
- include_context "isolate load path mutation"
1029
-
1030
- it 'records paths added to the load path' do
1031
- config.libs = ["a/dir"]
1032
- expect(config.libs).to eq ["a/dir"]
1033
- end
1034
- end
1035
-
1036
- describe "#add_setting" do
1037
- describe "with no modifiers" do
1038
- context "with no additional options" do
1039
- before do
1040
- config.add_setting :custom_option
1041
- end
1042
-
1043
- it "defaults to nil" do
1044
- expect(config.custom_option).to be_nil
1045
- end
1046
-
1047
- it "adds a predicate" do
1048
- expect(config.custom_option?).to be_falsey
1049
- end
1050
-
1051
- it "can be overridden" do
1052
- config.custom_option = "a value"
1053
- expect(config.custom_option).to eq("a value")
1054
- end
1055
- end
1056
-
1057
- context "with :default => 'a value'" do
1058
- before do
1059
- config.add_setting :custom_option, :default => 'a value'
1060
- end
1061
-
1062
- it "defaults to 'a value'" do
1063
- expect(config.custom_option).to eq("a value")
1064
- end
1065
-
1066
- it "returns true for the predicate" do
1067
- expect(config.custom_option?).to be_truthy
1068
- end
1069
-
1070
- it "can be overridden with a truthy value" do
1071
- config.custom_option = "a new value"
1072
- expect(config.custom_option).to eq("a new value")
1073
- end
1074
-
1075
- it "can be overridden with nil" do
1076
- config.custom_option = nil
1077
- expect(config.custom_option).to eq(nil)
1078
- end
1079
-
1080
- it "can be overridden with false" do
1081
- config.custom_option = false
1082
- expect(config.custom_option).to eq(false)
1083
- end
1084
- end
1085
- end
1086
-
1087
- context "with :alias_with => " do
1088
- before do
1089
- config.add_setting :custom_option, :alias_with => :another_custom_option
1090
- end
1091
-
1092
- it "delegates the getter to the other option" do
1093
- config.another_custom_option = "this value"
1094
- expect(config.custom_option).to eq("this value")
1095
- end
1096
-
1097
- it "delegates the setter to the other option" do
1098
- config.custom_option = "this value"
1099
- expect(config.another_custom_option).to eq("this value")
1100
- end
1101
-
1102
- it "delegates the predicate to the other option" do
1103
- config.custom_option = true
1104
- expect(config.another_custom_option?).to be_truthy
1105
- end
1106
- end
1107
- end
1108
-
1109
- describe "#configure_group" do
1110
- it "extends with 'extend'" do
1111
- mod = Module.new
1112
- group = ExampleGroup.describe("group", :foo => :bar)
1113
-
1114
- config.extend(mod, :foo => :bar)
1115
- config.configure_group(group)
1116
- expect(group).to be_a(mod)
1117
- end
1118
-
1119
- it "extends with 'module'" do
1120
- mod = Module.new
1121
- group = ExampleGroup.describe("group", :foo => :bar)
1122
-
1123
- config.include(mod, :foo => :bar)
1124
- config.configure_group(group)
1125
- expect(group.included_modules).to include(mod)
1126
- end
1127
-
1128
- it "requires only one matching filter" do
1129
- mod = Module.new
1130
- group = ExampleGroup.describe("group", :foo => :bar)
1131
-
1132
- config.include(mod, :foo => :bar, :baz => :bam)
1133
- config.configure_group(group)
1134
- expect(group.included_modules).to include(mod)
1135
- end
1136
-
1137
- it "includes each one before deciding whether to include the next" do
1138
- mod1 = Module.new do
1139
- def self.included(host)
1140
- host.metadata[:foo] = :bar
1141
- end
1142
- end
1143
- mod2 = Module.new
1144
-
1145
- group = ExampleGroup.describe("group")
1146
-
1147
- config.include(mod1)
1148
- config.include(mod2, :foo => :bar)
1149
- config.configure_group(group)
1150
- expect(group.included_modules).to include(mod1)
1151
- expect(group.included_modules).to include(mod2)
1152
- end
1153
-
1154
- module IncludeOrExtendMeOnce
1155
- def self.included(host)
1156
- raise "included again" if host.instance_methods.include?(:foobar)
1157
- host.class_eval { def foobar; end }
1158
- end
1159
-
1160
- def self.extended(host)
1161
- raise "extended again" if host.respond_to?(:foobar)
1162
- def host.foobar; end
1163
- end
1164
- end
1165
-
1166
- it "doesn't include a module when already included in ancestor" do
1167
- config.include(IncludeOrExtendMeOnce, :foo => :bar)
1168
-
1169
- group = ExampleGroup.describe("group", :foo => :bar)
1170
- child = group.describe("child")
1171
-
1172
- config.configure_group(group)
1173
- config.configure_group(child)
1174
- end
1175
-
1176
- it "doesn't extend when ancestor is already extended with same module" do
1177
- config.extend(IncludeOrExtendMeOnce, :foo => :bar)
1178
-
1179
- group = ExampleGroup.describe("group", :foo => :bar)
1180
- child = group.describe("child")
1181
-
1182
- config.configure_group(group)
1183
- config.configure_group(child)
1184
- end
1185
- end
1186
-
1187
- describe "#alias_example_group_to" do
1188
- after do
1189
- RSpec::Core::DSL.example_group_aliases.delete(:my_group_method)
1190
-
1191
- RSpec.module_eval do
1192
- class << self
1193
- undef :my_group_method if method_defined? :my_group_method
1194
- end
1195
- end
1196
-
1197
- RSpec::Core::ExampleGroup.module_eval do
1198
- class << self
1199
- undef :my_group_method if method_defined? :my_group_method
1200
- end
1201
- end
1202
- end
1203
-
1204
- it_behaves_like "metadata hash builder" do
1205
- def metadata_hash(*args)
1206
- config.alias_example_group_to :my_group_method, *args
1207
- group = ExampleGroup.my_group_method("a group")
1208
- group.metadata
1209
- end
1210
- end
1211
-
1212
- it "allows adding additional metadata" do
1213
- config.alias_example_group_to :my_group_method, { :some => "thing" }
1214
- group = ExampleGroup.my_group_method("a group", :another => "thing")
1215
- expect(group.metadata).to include(:some => "thing", :another => "thing")
1216
- end
1217
-
1218
- context 'when the aliased method is used' do
1219
- it_behaves_like "metadata hash builder" do
1220
- def metadata_hash(*args)
1221
- config.alias_example_group_to :my_group_method
1222
- group = ExampleGroup.my_group_method("a group", *args)
1223
- group.metadata
1224
- end
1225
- end
1226
- end
1227
- end
1228
-
1229
- describe "#alias_example_to" do
1230
- it_behaves_like "metadata hash builder" do
1231
- after do
1232
- RSpec::Core::ExampleGroup.module_eval do
1233
- class << self
1234
- undef :my_example_method if method_defined? :my_example_method
1235
- end
1236
- end
1237
- end
1238
- def metadata_hash(*args)
1239
- config.alias_example_to :my_example_method, *args
1240
- group = ExampleGroup.describe("group")
1241
- example = group.my_example_method("description")
1242
- example.metadata
1243
- end
1244
- end
1245
- end
1246
-
1247
- describe "#reset" do
1248
- it "clears the reporter" do
1249
- expect(config.reporter).not_to be_nil
1250
- config.reset
1251
- expect(config.instance_variable_get("@reporter")).to be_nil
1252
- end
1253
-
1254
- it "clears the formatters" do
1255
- config.add_formatter "doc"
1256
- config.reset
1257
- expect(config.formatters).to be_empty
1258
- end
1259
- end
1260
-
1261
- describe "#force" do
1262
- context "for ordering options" do
1263
- let(:list) { [1, 2, 3, 4] }
1264
- let(:ordering_strategy) { config.ordering_registry.fetch(:global) }
1265
- let(:rng) { RSpec::Core::RandomNumberGenerator.new config.seed }
1266
- let(:shuffled) { Ordering::Random.new(config).shuffle list, rng }
1267
-
1268
- specify "CLI `--order defined` takes precedence over `config.order = rand`" do
1269
- config.force :order => "defined"
1270
- config.order = "rand"
1271
-
1272
- expect(ordering_strategy.order(list)).to eq([1, 2, 3, 4])
1273
- end
1274
-
1275
- specify "CLI `--order rand:37` takes precedence over `config.order = defined`" do
1276
- config.force :order => "rand:37"
1277
- config.order = "defined"
1278
-
1279
- expect(ordering_strategy.order(list)).to eq(shuffled)
1280
- end
1281
-
1282
- specify "CLI `--seed 37` forces order and seed" do
1283
- config.force :seed => 37
1284
- config.order = "defined"
1285
- config.seed = 145
1286
-
1287
- expect(ordering_strategy.order(list)).to eq(shuffled)
1288
- expect(config.seed).to eq(37)
1289
- end
1290
-
1291
- specify "CLI `--order defined` takes precedence over `config.register_ordering(:global)`" do
1292
- config.force :order => "defined"
1293
- config.register_ordering(:global, &:reverse)
1294
- expect(ordering_strategy.order(list)).to eq([1, 2, 3, 4])
1295
- end
1296
- end
1297
-
1298
- it "forces 'false' value" do
1299
- config.add_setting :custom_option
1300
- config.custom_option = true
1301
- expect(config.custom_option?).to be_truthy
1302
- config.force :custom_option => false
1303
- expect(config.custom_option?).to be_falsey
1304
- config.custom_option = true
1305
- expect(config.custom_option?).to be_falsey
1306
- end
1307
- end
1308
-
1309
- describe '#seed' do
1310
- it 'returns the seed as an int' do
1311
- config.seed = '123'
1312
- expect(config.seed).to eq(123)
1313
- end
1314
- end
1315
-
1316
- describe "#seed_used?" do
1317
- def use_seed_on(registry)
1318
- registry.fetch(:random).order([1, 2])
1319
- end
1320
-
1321
- it 'returns false if neither ordering registry used the seed' do
1322
- expect(config.seed_used?).to be false
1323
- end
1324
-
1325
- it 'returns true if the ordering registry used the seed' do
1326
- use_seed_on(config.ordering_registry)
1327
- expect(config.seed_used?).to be true
1328
- end
1329
- end
1330
-
1331
- describe '#order=' do
1332
- context 'given "random"' do
1333
- before do
1334
- config.seed = 7654
1335
- config.order = 'random'
1336
- end
1337
-
1338
- it 'does not change the seed' do
1339
- expect(config.seed).to eq(7654)
1340
- end
1341
-
1342
- it 'sets up random ordering' do
1343
- allow(RSpec).to receive_messages(:configuration => config)
1344
- global_ordering = config.ordering_registry.fetch(:global)
1345
- expect(global_ordering).to be_an_instance_of(Ordering::Random)
1346
- end
1347
- end
1348
-
1349
- context 'given "random:123"' do
1350
- before { config.order = 'random:123' }
1351
-
1352
- it 'sets seed to 123' do
1353
- expect(config.seed).to eq(123)
1354
- end
1355
-
1356
- it 'sets up random ordering' do
1357
- allow(RSpec).to receive_messages(:configuration => config)
1358
- global_ordering = config.ordering_registry.fetch(:global)
1359
- expect(global_ordering).to be_an_instance_of(Ordering::Random)
1360
- end
1361
- end
1362
-
1363
- context 'given "defined"' do
1364
- before do
1365
- config.order = 'rand:123'
1366
- config.order = 'defined'
1367
- end
1368
-
1369
- it "does not change the seed" do
1370
- expect(config.seed).to eq(123)
1371
- end
1372
-
1373
- it 'clears the random ordering' do
1374
- allow(RSpec).to receive_messages(:configuration => config)
1375
- list = [1, 2, 3, 4]
1376
- ordering_strategy = config.ordering_registry.fetch(:global)
1377
- expect(ordering_strategy.order(list)).to eq([1, 2, 3, 4])
1378
- end
1379
- end
1380
- end
1381
-
1382
- describe "#register_ordering" do
1383
- def register_reverse_ordering
1384
- config.register_ordering(:reverse, &:reverse)
1385
- end
1386
-
1387
- it 'stores the ordering for later use' do
1388
- register_reverse_ordering
1389
-
1390
- list = [1, 2, 3]
1391
- strategy = config.ordering_registry.fetch(:reverse)
1392
- expect(strategy).to be_a(Ordering::Custom)
1393
- expect(strategy.order(list)).to eq([3, 2, 1])
1394
- end
1395
-
1396
- it 'can register an ordering object' do
1397
- strategy = Object.new
1398
- def strategy.order(list)
1399
- list.reverse
1400
- end
1401
-
1402
- config.register_ordering(:reverse, strategy)
1403
- list = [1, 2, 3]
1404
- fetched = config.ordering_registry.fetch(:reverse)
1405
- expect(fetched).to be(strategy)
1406
- expect(fetched.order(list)).to eq([3, 2, 1])
1407
- end
1408
- end
1409
-
1410
- describe '#warnings' do
1411
- around do |example|
1412
- @_original_setting = $VERBOSE
1413
- example.run
1414
- $VERBOSE = @_original_setting
1415
- end
1416
-
1417
- it "sets verbose to true when true" do
1418
- config.warnings = true
1419
- expect($VERBOSE).to eq true
1420
- end
1421
-
1422
- it "sets verbose to false when true" do
1423
- config.warnings = false
1424
- expect($VERBOSE).to eq false
1425
- end
1426
-
1427
- it 'returns the verbosity setting' do
1428
- expect(config.warnings).to eq $VERBOSE
1429
- end
1430
-
1431
- it 'is loaded from config by #force' do
1432
- config.force :warnings => true
1433
- expect($VERBOSE).to eq true
1434
- end
1435
- end
1436
-
1437
- describe "#raise_errors_for_deprecations!" do
1438
- it 'causes deprecations to raise errors rather than printing to the deprecation stream' do
1439
- config.deprecation_stream = stream = StringIO.new
1440
- config.raise_errors_for_deprecations!
1441
-
1442
- expect {
1443
- config.reporter.deprecation(:deprecated => "foo", :call_site => "foo.rb:1")
1444
- }.to raise_error(RSpec::Core::DeprecationError, /foo is deprecated/)
1445
-
1446
- expect(stream.string).to eq("")
1447
- end
1448
- end
1449
-
1450
- describe "#expose_current_running_example_as" do
1451
- before { stub_const(Configuration::ExposeCurrentExample.name, Module.new) }
1452
-
1453
- it 'exposes the current example via the named method' do
1454
- RSpec.configuration.expose_current_running_example_as :the_example
1455
- RSpec.configuration.expose_current_running_example_as :another_example_helper
1456
-
1457
- value_1 = value_2 = nil
1458
-
1459
- ExampleGroup.describe "Group" do
1460
- it "works" do
1461
- value_1 = the_example
1462
- value_2 = another_example_helper
1463
- end
1464
- end.run
1465
-
1466
- expect(value_1).to be_an(RSpec::Core::Example)
1467
- expect(value_1.description).to eq("works")
1468
- expect(value_2).to be(value_1)
1469
- end
1470
- end
1471
-
1472
- # assigns files_or_directories_to_run and triggers post-processing
1473
- # via `files_to_run`.
1474
- def assign_files_or_directories_to_run(*value)
1475
- config.files_or_directories_to_run = value
1476
- config.files_to_run
1477
- end
1478
- end
1479
- end