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,491 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module RSpec
4
- module Core
5
- RSpec.describe Metadata do
6
-
7
- describe '.relative_path' do
8
- let(:here) { File.expand_path(".") }
9
- it "transforms absolute paths to relative paths" do
10
- expect(Metadata.relative_path(here)).to eq "."
11
- end
12
- it "transforms absolute paths to relative paths anywhere in its argument" do
13
- expect(Metadata.relative_path("foo #{here} bar")).to eq "foo . bar"
14
- end
15
- it "returns nil if passed an unparseable file:line combo" do
16
- expect(Metadata.relative_path("-e:1")).to be_nil
17
- end
18
- # I have no idea what line = line.sub(/\A([^:]+:\d+)$/, '\\1') is supposed to do
19
- it "gracefully returns nil if run in a secure thread" do
20
- safely do
21
- value = Metadata.relative_path(".")
22
- # on some rubies, File.expand_path is not a security error, so accept "." as well
23
- expect([nil, "."]).to include(value)
24
- end
25
- end
26
-
27
- end
28
-
29
- describe "#process" do
30
- Metadata::RESERVED_KEYS.each do |key|
31
- it "prohibits :#{key} as a hash key" do
32
- m = Metadata.new
33
- expect do
34
- m.process('group', key => {})
35
- end.to raise_error(/:#{key} is not allowed/)
36
- end
37
- end
38
-
39
- it "uses :caller if passed as part of the user metadata" do
40
- m = Metadata.new
41
- m.process('group', :caller => ['example_file:42'])
42
- expect(m[:example_group][:location]).to eq("example_file:42")
43
- end
44
- end
45
-
46
- describe "#filter_applies?" do
47
- let(:parent_group_metadata) { Metadata.new.process('parent group', :caller => ["foo_spec.rb:#{__LINE__}"]) }
48
- let(:group_metadata) { Metadata.new(parent_group_metadata).process('group', :caller => ["foo_spec.rb:#{__LINE__}"]) }
49
- let(:example_metadata) { group_metadata.for_example('example', :caller => ["foo_spec.rb:#{__LINE__}"], :if => true) }
50
- let(:next_example_metadata) { group_metadata.for_example('next_example', :caller => ["foo_spec.rb:#{example_line_number + 2}"]) }
51
- let(:world) { World.new }
52
-
53
- before { allow(RSpec).to receive(:world) { world } }
54
-
55
- shared_examples_for "matching by line number" do
56
- let(:preceeding_declaration_lines) {{
57
- parent_group_metadata[:example_group][:line_number] => parent_group_metadata[:example_group][:line_number],
58
- group_metadata[:example_group][:line_number] => group_metadata[:example_group][:line_number],
59
- example_metadata[:line_number] => example_metadata[:line_number],
60
- (example_metadata[:line_number] + 1) => example_metadata[:line_number],
61
- (example_metadata[:line_number] + 2) => example_metadata[:line_number] + 2,
62
- }}
63
- before do
64
- expect(world).to receive(:preceding_declaration_line).at_least(:once) do |v|
65
- preceeding_declaration_lines[v]
66
- end
67
- end
68
-
69
- it "matches the group when the line_number is the example group line number" do
70
- # this call doesn't really make sense since filter_applies? is only called
71
- # for example metadata not group metadata
72
- expect(group_metadata.filter_applies?(condition_key, group_condition)).to be_truthy
73
- end
74
-
75
- it "matches the example when the line_number is the grandparent example group line number" do
76
- expect(example_metadata.filter_applies?(condition_key, parent_group_condition)).to be_truthy
77
- end
78
-
79
- it "matches the example when the line_number is the parent example group line number" do
80
- expect(example_metadata.filter_applies?(condition_key, group_condition)).to be_truthy
81
- end
82
-
83
- it "matches the example when the line_number is the example line number" do
84
- expect(example_metadata.filter_applies?(condition_key, example_condition)).to be_truthy
85
- end
86
-
87
- it "matches when the line number is between this example and the next" do
88
- expect(example_metadata.filter_applies?(condition_key, between_examples_condition)).to be_truthy
89
- end
90
-
91
- it "does not match when the line number matches the next example" do
92
- expect(example_metadata.filter_applies?(condition_key, next_example_condition)).to be_falsey
93
- end
94
- end
95
-
96
- context "with a single line number" do
97
- let(:condition_key){ :line_numbers }
98
- let(:parent_group_condition) { [parent_group_metadata[:example_group][:line_number]] }
99
- let(:group_condition) { [group_metadata[:example_group][:line_number]] }
100
- let(:example_condition) { [example_metadata[:line_number]] }
101
- let(:between_examples_condition) { [group_metadata[:example_group][:line_number] + 1] }
102
- let(:next_example_condition) { [example_metadata[:line_number] + 2] }
103
-
104
- it_has_behavior "matching by line number"
105
- end
106
-
107
- context "with multiple line numbers" do
108
- let(:condition_key){ :line_numbers }
109
- let(:parent_group_condition) { [-1, parent_group_metadata[:example_group][:line_number]] }
110
- let(:group_condition) { [-1, group_metadata[:example_group][:line_number]] }
111
- let(:example_condition) { [-1, example_metadata[:line_number]] }
112
- let(:between_examples_condition) { [-1, group_metadata[:example_group][:line_number] + 1] }
113
- let(:next_example_condition) { [-1, example_metadata[:line_number] + 2] }
114
-
115
- it_has_behavior "matching by line number"
116
- end
117
-
118
- context "with locations" do
119
- let(:condition_key){ :locations }
120
- let(:parent_group_condition) do
121
- {File.expand_path(parent_group_metadata[:example_group][:file_path]) => [parent_group_metadata[:example_group][:line_number]]}
122
- end
123
- let(:group_condition) do
124
- {File.expand_path(group_metadata[:example_group][:file_path]) => [group_metadata[:example_group][:line_number]]}
125
- end
126
- let(:example_condition) do
127
- {File.expand_path(example_metadata[:file_path]) => [example_metadata[:line_number]]}
128
- end
129
- let(:between_examples_condition) do
130
- {File.expand_path(group_metadata[:example_group][:file_path]) => [group_metadata[:example_group][:line_number] + 1]}
131
- end
132
- let(:next_example_condition) do
133
- {File.expand_path(example_metadata[:file_path]) => [example_metadata[:line_number] + 2]}
134
- end
135
-
136
- it_has_behavior "matching by line number"
137
-
138
- it "ignores location filters for other files" do
139
- expect(example_metadata.filter_applies?(:locations, {"/path/to/other_spec.rb" => [3,5,7]})).to be_truthy
140
- end
141
- end
142
-
143
- it "matches a proc with no arguments that evaluates to true" do
144
- expect(example_metadata.filter_applies?(:if, lambda { true })).to be_truthy
145
- end
146
-
147
- it "matches a proc that evaluates to true" do
148
- expect(example_metadata.filter_applies?(:if, lambda { |v| v })).to be_truthy
149
- end
150
-
151
- it "does not match a proc that evaluates to false" do
152
- expect(example_metadata.filter_applies?(:if, lambda { |v| !v })).to be_falsey
153
- end
154
-
155
- it "matches a proc with an arity of 2" do
156
- example_metadata[:foo] = nil
157
- expect(example_metadata.filter_applies?(:foo, lambda { |v, m| m == example_metadata })).to be_truthy
158
- end
159
-
160
- it "raises an error when the proc has an incorrect arity" do
161
- expect {
162
- example_metadata.filter_applies?(:if, lambda { |a,b,c| true })
163
- }.to raise_error(ArgumentError)
164
- end
165
-
166
- context "with an Array" do
167
- let(:metadata_with_array) {
168
- group_metadata.for_example('example_with_array', :tag => [:one, 2, 'three', /four/])
169
- }
170
-
171
- it "matches a symbol" do
172
- expect(metadata_with_array.filter_applies?(:tag, 'one')).to be_truthy
173
- expect(metadata_with_array.filter_applies?(:tag, :one)).to be_truthy
174
- expect(metadata_with_array.filter_applies?(:tag, 'two')).to be_falsey
175
- end
176
-
177
- it "matches a string" do
178
- expect(metadata_with_array.filter_applies?(:tag, 'three')).to be_truthy
179
- expect(metadata_with_array.filter_applies?(:tag, :three)).to be_truthy
180
- expect(metadata_with_array.filter_applies?(:tag, 'tree')).to be_falsey
181
- end
182
-
183
- it "matches an integer" do
184
- expect(metadata_with_array.filter_applies?(:tag, '2')).to be_truthy
185
- expect(metadata_with_array.filter_applies?(:tag, 2)).to be_truthy
186
- expect(metadata_with_array.filter_applies?(:tag, 3)).to be_falsey
187
- end
188
-
189
- it "matches a regexp" do
190
- expect(metadata_with_array.filter_applies?(:tag, 'four')).to be_truthy
191
- expect(metadata_with_array.filter_applies?(:tag, 'fourtune')).to be_truthy
192
- expect(metadata_with_array.filter_applies?(:tag, 'fortune')).to be_falsey
193
- end
194
-
195
- it "matches a proc that evaluates to true" do
196
- expect(metadata_with_array.filter_applies?(:tag, lambda { |values| values.include? 'three' })).to be_truthy
197
- end
198
-
199
- it "does not match a proc that evaluates to false" do
200
- expect(metadata_with_array.filter_applies?(:tag, lambda { |values| values.include? 'nothing' })).to be_falsey
201
- end
202
- end
203
- end
204
-
205
- describe "#for_example" do
206
- let(:metadata) { Metadata.new.process("group description") }
207
- let(:mfe) { metadata.for_example("example description", {:arbitrary => :options}) }
208
- let(:line_number) { __LINE__ - 1 }
209
-
210
- it "stores the description args" do
211
- expect(mfe.fetch(:description_args)).to eq ["example description"]
212
- expect(mfe[:description_args]).to eq ["example description"]
213
- end
214
-
215
- it "ignores nil description args" do
216
- expect(metadata.for_example(nil, {}).fetch(:description_args)).to eq []
217
- expect(metadata.for_example(nil, {})[:description_args]).to eq []
218
- end
219
-
220
- it "stores the full_description (group description + example description)" do
221
- expect(mfe.fetch(:full_description)).to eq("group description example description")
222
- expect(mfe[:full_description]).to eq("group description example description")
223
- end
224
-
225
- it "creates an empty execution result" do
226
- expect(mfe.fetch(:execution_result)).to eq({})
227
- expect(mfe[:execution_result]).to eq({})
228
- end
229
-
230
- it "extracts file path from caller" do
231
- expect(mfe.fetch(:file_path)).to eq(relative_path(__FILE__))
232
- expect(mfe[:file_path]).to eq(relative_path(__FILE__))
233
- end
234
-
235
- it "extracts line number from caller" do
236
- expect(mfe.fetch(:line_number)).to eq(line_number)
237
- expect(mfe[:line_number]).to eq(line_number)
238
- end
239
-
240
- it "extracts location from caller" do
241
- expect(mfe.fetch(:location)).to eq("#{relative_path(__FILE__)}:#{line_number}")
242
- expect(mfe[:location]).to eq("#{relative_path(__FILE__)}:#{line_number}")
243
- end
244
-
245
- it "uses :caller if passed as an option" do
246
- example_metadata = metadata.for_example('example description', {:caller => ['example_file:42']})
247
- expect(example_metadata[:location]).to eq("example_file:42")
248
- end
249
-
250
- it "merges arbitrary options" do
251
- expect(mfe.fetch(:arbitrary)).to eq(:options)
252
- expect(mfe[:arbitrary]).to eq(:options)
253
- end
254
-
255
- it "points :example_group to the same hash object" do
256
- a = metadata.for_example("foo", {})[:example_group]
257
- b = metadata.for_example("bar", {})[:example_group]
258
- a[:description] = "new description"
259
- expect(b[:description]).to eq("new description")
260
- end
261
- end
262
-
263
- [:described_class, :describes].each do |key|
264
- describe key do
265
- context "with a String" do
266
- it "returns nil" do
267
- m = Metadata.new
268
- m.process('group')
269
-
270
- expect(m[:example_group][key]).to be_nil
271
- end
272
- end
273
-
274
- context "with a Symbol" do
275
- it "returns nil" do
276
- m = Metadata.new
277
- m.process(:group)
278
-
279
- expect(m[:example_group][key]).to be_nil
280
- end
281
- end
282
-
283
- context "with a class" do
284
- it "returns the class" do
285
- m = Metadata.new
286
- m.process(String)
287
-
288
- expect(m[:example_group][key]).to be(String)
289
- end
290
- end
291
-
292
- context "in a nested group" do
293
- it "returns the parent group's described class" do
294
- sm = Metadata.new
295
- sm.process(String)
296
-
297
- m = Metadata.new(sm)
298
- m.process(Array)
299
-
300
- expect(m[:example_group][key]).to be(String)
301
- end
302
-
303
- it "returns own described class if parent doesn't have one" do
304
- sm = Metadata.new
305
- sm.process("foo")
306
-
307
- m = Metadata.new(sm)
308
- m.process(Array)
309
-
310
- expect(m[:example_group][key]).to be(Array)
311
- end
312
-
313
- it "can override a parent group's described class" do
314
- parent = Metadata.new
315
- parent.process(String)
316
-
317
- child = Metadata.new(parent)
318
- child.process(Fixnum)
319
- child[:example_group][key] = Hash
320
-
321
- grandchild = Metadata.new(child)
322
- grandchild.process(Array)
323
-
324
- expect(grandchild[:example_group][key]).to be(Hash)
325
- expect(child[:example_group][key]).to be(Hash)
326
- expect(parent[:example_group][key]).to be(String)
327
- end
328
- end
329
- end
330
- end
331
-
332
- describe ":description" do
333
- it "just has the example description" do
334
- m = Metadata.new
335
- m.process("group")
336
-
337
- m = m.for_example("example", {})
338
- expect(m[:description]).to eq("example")
339
- end
340
-
341
- context "with a string" do
342
- it "provides the submitted description" do
343
- m = Metadata.new
344
- m.process("group")
345
-
346
- expect(m[:example_group][:description]).to eq("group")
347
- end
348
- end
349
-
350
- context "with a non-string" do
351
- it "provides the submitted description" do
352
- m = Metadata.new
353
- m.process("group")
354
-
355
- expect(m[:example_group][:description]).to eq("group")
356
- end
357
- end
358
-
359
- context "with a non-string and a string" do
360
- it "concats the args" do
361
- m = Metadata.new
362
- m.process(Object, 'group')
363
-
364
- expect(m[:example_group][:description]).to eq("Object group")
365
- end
366
- end
367
-
368
- context "with empty args" do
369
- it "returns empty string for [:example_group][:description]" do
370
- m = Metadata.new
371
- m.process()
372
-
373
- expect(m[:example_group][:description]).to eq("")
374
- end
375
- end
376
- end
377
-
378
- describe ":full_description" do
379
- it "concats example group name and description" do
380
- group_metadata = Metadata.new
381
- group_metadata.process('group')
382
-
383
- example_metadata = group_metadata.for_example("example", {})
384
- expect(example_metadata[:full_description]).to eq("group example")
385
- end
386
-
387
- it "concats nested example group descriptions" do
388
- parent = Metadata.new
389
- parent.process('parent')
390
-
391
- child = Metadata.new(parent)
392
- child.process('child')
393
-
394
- expect(child[:example_group][:full_description]).to eq("parent child")
395
- expect(child.for_example('example', child)[:full_description]).to eq("parent child example")
396
- end
397
-
398
- it "concats nested example group descriptions three deep" do
399
- grandparent = Metadata.new
400
- grandparent.process('grandparent')
401
-
402
- parent = Metadata.new(grandparent)
403
- parent.process('parent')
404
-
405
- child = Metadata.new(parent)
406
- child.process('child')
407
-
408
- expect(grandparent[:example_group][:full_description]).to eq("grandparent")
409
- expect(parent[:example_group][:full_description]).to eq("grandparent parent")
410
- expect(child[:example_group][:full_description]).to eq("grandparent parent child")
411
- expect(child.for_example('example', child)[:full_description]).to eq("grandparent parent child example")
412
- end
413
-
414
- %w[# . ::].each do |char|
415
- context "with a 2nd arg starting with #{char}" do
416
- it "removes the space" do
417
- m = Metadata.new
418
- m.process(Array, "#{char}method")
419
- expect(m[:example_group][:full_description]).to eq("Array#{char}method")
420
- end
421
- end
422
-
423
- context "with a description starting with #{char} nested under a module" do
424
- it "removes the space" do
425
- parent = Metadata.new
426
- parent.process(Object)
427
- child = Metadata.new(parent)
428
- child.process("#{char}method")
429
- expect(child[:example_group][:full_description]).to eq("Object#{char}method")
430
- end
431
- end
432
-
433
- context "with a description starting with #{char} nested under a context string" do
434
- it "does not remove the space" do
435
- grandparent = Metadata.new
436
- grandparent.process(Array)
437
- parent = Metadata.new(grandparent)
438
- parent.process("with 2 items")
439
- child = Metadata.new(parent)
440
- child.process("#{char}method")
441
- expect(child[:example_group][:full_description]).to eq("Array with 2 items #{char}method")
442
- end
443
- end
444
- end
445
- end
446
-
447
- describe ":file_path" do
448
- it "finds the first non-rspec lib file in the caller array" do
449
- m = Metadata.new
450
- m.process(:caller => [
451
- "./lib/rspec/core/foo.rb",
452
- "#{__FILE__}:#{__LINE__}"
453
- ])
454
- expect(m[:example_group][:file_path]).to eq(relative_path(__FILE__))
455
- end
456
- end
457
-
458
- describe ":line_number" do
459
- it "finds the line number with the first non-rspec lib file in the backtrace" do
460
- m = Metadata.new
461
- m.process({})
462
- expect(m[:example_group][:line_number]).to eq(__LINE__ - 1)
463
- end
464
-
465
- it "finds the line number with the first spec file with drive letter" do
466
- m = Metadata.new
467
- m.process(:caller => [ "C:/path/to/file_spec.rb:#{__LINE__}" ])
468
- expect(m[:example_group][:line_number]).to eq(__LINE__ - 1)
469
- end
470
-
471
- it "uses the number after the first : for ruby 1.9" do
472
- m = Metadata.new
473
- m.process(:caller => [ "#{__FILE__}:#{__LINE__}:999" ])
474
- expect(m[:example_group][:line_number]).to eq(__LINE__ - 1)
475
- end
476
- end
477
-
478
- describe "child example group" do
479
- it "nests the parent's example group metadata" do
480
- parent = Metadata.new
481
- parent.process(Object, 'parent')
482
-
483
- child = Metadata.new(parent)
484
- child.process()
485
-
486
- expect(child[:example_group][:example_group]).to eq(parent[:example_group])
487
- end
488
- end
489
- end
490
- end
491
- end