rspec-core 3.0.0.beta2 → 3.0.0.rc1

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 (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