cucumber-core 10.1.1 → 11.1.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +203 -284
- data/README.md +0 -1
- data/lib/cucumber/core/test/case.rb +11 -1
- data/lib/cucumber/core/test/data_table.rb +4 -0
- data/lib/cucumber/core/test/doc_string.rb +4 -1
- data/lib/cucumber/core/test/empty_multiline_argument.rb +2 -2
- data/lib/cucumber/core/test/filters/locations_filter.rb +1 -1
- data/lib/cucumber/core/test/location.rb +15 -5
- data/lib/cucumber/core/test/step.rb +4 -0
- metadata +29 -94
- data/lib/cucumber/core/version.rb +0 -10
- data/spec/coverage.rb +0 -12
- data/spec/cucumber/core/compiler_spec.rb +0 -241
- data/spec/cucumber/core/event_bus_spec.rb +0 -163
- data/spec/cucumber/core/event_spec.rb +0 -40
- data/spec/cucumber/core/filter_spec.rb +0 -101
- data/spec/cucumber/core/gherkin/parser_spec.rb +0 -162
- data/spec/cucumber/core/gherkin/writer_spec.rb +0 -332
- data/spec/cucumber/core/report/summary_spec.rb +0 -178
- data/spec/cucumber/core/test/action_spec.rb +0 -153
- data/spec/cucumber/core/test/case_spec.rb +0 -125
- data/spec/cucumber/core/test/data_table_spec.rb +0 -79
- data/spec/cucumber/core/test/doc_string_spec.rb +0 -111
- data/spec/cucumber/core/test/duration_matcher.rb +0 -20
- data/spec/cucumber/core/test/empty_multiline_argument_spec.rb +0 -28
- data/spec/cucumber/core/test/filters/locations_filter_spec.rb +0 -271
- data/spec/cucumber/core/test/location_spec.rb +0 -129
- data/spec/cucumber/core/test/result_spec.rb +0 -504
- data/spec/cucumber/core/test/runner_spec.rb +0 -320
- data/spec/cucumber/core/test/step_spec.rb +0 -88
- data/spec/cucumber/core/test/timer_spec.rb +0 -25
- data/spec/cucumber/core_spec.rb +0 -262
- data/spec/report_api_spy.rb +0 -25
@@ -1,129 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'cucumber/core/test/location'
|
3
|
-
|
4
|
-
module Cucumber::Core::Test
|
5
|
-
RSpec::Matchers.define :be_included_in do |expected|
|
6
|
-
match do |actual|
|
7
|
-
expected.include? actual
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
describe Location do
|
12
|
-
let(:line) { 12 }
|
13
|
-
let(:file) { "foo.feature" }
|
14
|
-
|
15
|
-
describe "equality" do
|
16
|
-
it "is equal to another Location on the same line of the same file" do
|
17
|
-
one_location = Location.new(file, line)
|
18
|
-
another_location = Location.new(file, line)
|
19
|
-
expect( one_location ).to eq another_location
|
20
|
-
end
|
21
|
-
|
22
|
-
it "is not equal to a wild card of the same file" do
|
23
|
-
expect( Location.new(file, line) ).not_to eq Location.new(file)
|
24
|
-
end
|
25
|
-
|
26
|
-
context "collections of locations" do
|
27
|
-
it "behave as expected with uniq" do
|
28
|
-
unique_collection = [Location.new(file, line), Location.new(file, line)].uniq
|
29
|
-
expect( unique_collection ).to eq [Location.new(file, line)]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "to_s" do
|
35
|
-
it "is file:line for a precise location" do
|
36
|
-
expect( Location.new("foo.feature", 12).to_s ).to eq "foo.feature:12"
|
37
|
-
end
|
38
|
-
|
39
|
-
it "is file for a wildcard location" do
|
40
|
-
expect( Location.new("foo.feature").to_s ).to eq "foo.feature"
|
41
|
-
end
|
42
|
-
|
43
|
-
it "is file:first_line..last_line for a ranged location" do
|
44
|
-
expect( Location.new("foo.feature", 13..19).to_s ).to eq "foo.feature:13..19"
|
45
|
-
end
|
46
|
-
|
47
|
-
it "is file:line:line:line for an arbitrary set of lines" do
|
48
|
-
expect( Location.new("foo.feature", [1, 3, 5]).to_s ).to eq "foo.feature:1:3:5"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "matches" do
|
53
|
-
let(:matching) { Location.new(file, line) }
|
54
|
-
let(:same_file_other_line) { Location.new(file, double) }
|
55
|
-
let(:not_matching) { Location.new(other_file, line) }
|
56
|
-
let(:other_file) { double }
|
57
|
-
|
58
|
-
context 'a precise location' do
|
59
|
-
let(:precise) { Location.new(file, line) }
|
60
|
-
|
61
|
-
it "matches a precise location of the same file and line" do
|
62
|
-
expect( matching ).to be_match(precise)
|
63
|
-
end
|
64
|
-
|
65
|
-
it "does not match a precise location on a different line in the same file" do
|
66
|
-
expect( matching ).not_to be_match(same_file_other_line)
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'a wildcard' do
|
72
|
-
let(:wildcard) { Location.new(file) }
|
73
|
-
|
74
|
-
it "matches any location with the same filename" do
|
75
|
-
expect( wildcard ).to be_match(matching)
|
76
|
-
end
|
77
|
-
|
78
|
-
it "is matched by any location of the same file" do
|
79
|
-
expect( matching ).to be_match(wildcard)
|
80
|
-
end
|
81
|
-
|
82
|
-
it "does not match a location in a different file" do
|
83
|
-
expect( wildcard ).not_to be_match(not_matching)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
describe "created from source location" do
|
89
|
-
context "when the location is in the tree below pwd" do
|
90
|
-
it "create a relative path from pwd" do
|
91
|
-
expect( Location.from_source_location("#{Dir.pwd}/path/file.rb", 1).file ).to eq "path/file.rb"
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context "when the location is in an installed gem" do
|
96
|
-
it "create a relative path from the gem directory" do
|
97
|
-
expect( Location.from_source_location("/path/gems/gem-name/path/file.rb", 1).file ).to eq "gem-name/path/file.rb"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context "when the location is neither below pwd nor in an installed gem" do
|
102
|
-
it "use the absolute path to the file" do
|
103
|
-
# Use File.expand on expectation to ensure tests work on multiple platform.
|
104
|
-
# On Windows, it will return "C:/path/file.rb" as an absolute path while it will return "/path/file.rb" on Linux.
|
105
|
-
expect( Location.from_source_location("/path/file.rb", 1).file ).to eq File.expand_path("/path/file.rb")
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe "created from file-colon-line" do
|
111
|
-
it "handles also Windows paths" do
|
112
|
-
# NOTE: running this test on Windows will produce "c:/path/file.rb", but "c:\path\file.rb" on Linux.
|
113
|
-
expect( Location.from_file_colon_line("c:\\path\\file.rb:123").file ).to match(/c:(\\|\/)path(\\|\/)file.rb/)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
describe "created of caller" do
|
118
|
-
it "use the location of the caller" do
|
119
|
-
expect( Location.of_caller.to_s ).to be_included_in caller[0]
|
120
|
-
end
|
121
|
-
|
122
|
-
context "when specifying additional caller depth" do
|
123
|
-
it "use the location of the n:th caller" do
|
124
|
-
expect( Location.of_caller(1).to_s ).to be_included_in caller[1]
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
@@ -1,504 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
# frozen_string_literal: true
|
3
|
-
require 'cucumber/core/test/result'
|
4
|
-
require 'cucumber/core/test/duration_matcher'
|
5
|
-
|
6
|
-
module Cucumber::Core::Test
|
7
|
-
describe Result do
|
8
|
-
|
9
|
-
let(:visitor) { double('visitor') }
|
10
|
-
let(:args) { double('args') }
|
11
|
-
|
12
|
-
describe Result::Passed do
|
13
|
-
subject(:result) { Result::Passed.new(duration) }
|
14
|
-
let(:duration) { Result::Duration.new(1 * 1000 * 1000) }
|
15
|
-
|
16
|
-
it "describes itself to a visitor" do
|
17
|
-
expect( visitor ).to receive(:passed).with(args)
|
18
|
-
expect( visitor ).to receive(:duration).with(duration, args)
|
19
|
-
result.describe_to(visitor, args)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "converts to a string" do
|
23
|
-
expect( result.to_s ).to eq "✓"
|
24
|
-
end
|
25
|
-
|
26
|
-
it "converts to a Cucumber::Message::TestResult" do
|
27
|
-
message = result.to_message
|
28
|
-
expect(message.status).to eq(Cucumber::Messages::TestStepResultStatus::PASSED)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "has a duration" do
|
32
|
-
expect( result.duration ).to eq duration
|
33
|
-
end
|
34
|
-
|
35
|
-
it "requires the constructor argument" do
|
36
|
-
expect { Result::Passed.new }.to raise_error(ArgumentError)
|
37
|
-
end
|
38
|
-
|
39
|
-
it "does nothing when appending the backtrace" do
|
40
|
-
expect( result.with_appended_backtrace(double) ).to equal result
|
41
|
-
end
|
42
|
-
|
43
|
-
it "does nothing when filtering the backtrace" do
|
44
|
-
expect( result.with_filtered_backtrace(double) ).to equal result
|
45
|
-
end
|
46
|
-
|
47
|
-
specify { expect( result.to_sym ).to eq :passed }
|
48
|
-
|
49
|
-
specify { expect( result ).to be_passed }
|
50
|
-
specify { expect( result ).not_to be_failed }
|
51
|
-
specify { expect( result ).not_to be_undefined }
|
52
|
-
specify { expect( result ).not_to be_unknown }
|
53
|
-
specify { expect( result ).not_to be_skipped }
|
54
|
-
specify { expect( result ).not_to be_flaky }
|
55
|
-
|
56
|
-
specify { expect( result ).to be_ok }
|
57
|
-
specify { expect( result.ok? ).to be_truthy }
|
58
|
-
end
|
59
|
-
|
60
|
-
describe Result::Failed do
|
61
|
-
subject(:result) { Result::Failed.new(duration, exception) }
|
62
|
-
let(:duration) { Result::Duration.new(1 * 1000 * 1000) }
|
63
|
-
let(:exception) { StandardError.new("error message") }
|
64
|
-
|
65
|
-
it "describes itself to a visitor" do
|
66
|
-
expect( visitor ).to receive(:failed).with(args)
|
67
|
-
expect( visitor ).to receive(:duration).with(duration, args)
|
68
|
-
expect( visitor ).to receive(:exception).with(exception, args)
|
69
|
-
result.describe_to(visitor, args)
|
70
|
-
end
|
71
|
-
|
72
|
-
it "has a duration" do
|
73
|
-
expect( result.duration ).to eq duration
|
74
|
-
end
|
75
|
-
|
76
|
-
it "converts to a Cucumber::Message::TestResult" do
|
77
|
-
message = result.to_message
|
78
|
-
expect(message.status).to eq(Cucumber::Messages::TestStepResultStatus::FAILED)
|
79
|
-
end
|
80
|
-
|
81
|
-
it "requires both constructor arguments" do
|
82
|
-
expect { Result::Failed.new }.to raise_error(ArgumentError)
|
83
|
-
expect { Result::Failed.new(duration) }.to raise_error(ArgumentError)
|
84
|
-
end
|
85
|
-
|
86
|
-
it "does nothing if step has no backtrace line" do
|
87
|
-
result.exception.set_backtrace("exception backtrace")
|
88
|
-
step = "does not respond_to?(:backtrace_line)"
|
89
|
-
|
90
|
-
expect( result.with_appended_backtrace(step).exception.backtrace ).to eq(["exception backtrace"])
|
91
|
-
end
|
92
|
-
|
93
|
-
it "appends the backtrace line of the step" do
|
94
|
-
result.exception.set_backtrace("exception backtrace")
|
95
|
-
step = double
|
96
|
-
expect( step ).to receive(:backtrace_line).and_return("step_line")
|
97
|
-
|
98
|
-
expect( result.with_appended_backtrace(step).exception.backtrace ).to eq(["exception backtrace", "step_line"])
|
99
|
-
end
|
100
|
-
|
101
|
-
it "apply filters to the exception" do
|
102
|
-
filter_class = double
|
103
|
-
filter = double
|
104
|
-
filtered_exception = double
|
105
|
-
expect( filter_class ).to receive(:new).with(result.exception).and_return(filter)
|
106
|
-
expect( filter ).to receive(:exception).and_return(filtered_exception)
|
107
|
-
|
108
|
-
expect( result.with_filtered_backtrace(filter_class).exception ).to equal filtered_exception
|
109
|
-
end
|
110
|
-
|
111
|
-
specify { expect( result.to_sym ).to eq :failed }
|
112
|
-
|
113
|
-
specify { expect( result ).not_to be_passed }
|
114
|
-
specify { expect( result ).to be_failed }
|
115
|
-
specify { expect( result ).not_to be_undefined }
|
116
|
-
specify { expect( result ).not_to be_unknown }
|
117
|
-
specify { expect( result ).not_to be_skipped }
|
118
|
-
specify { expect( result ).not_to be_flaky }
|
119
|
-
|
120
|
-
specify { expect( result ).to_not be_ok }
|
121
|
-
specify { expect( result.ok? ).to be_falsey }
|
122
|
-
end
|
123
|
-
|
124
|
-
describe Result::Unknown do
|
125
|
-
subject(:result) { Result::Unknown.new }
|
126
|
-
|
127
|
-
it "doesn't describe itself to a visitor" do
|
128
|
-
visitor = double('never receives anything')
|
129
|
-
result.describe_to(visitor, args)
|
130
|
-
end
|
131
|
-
|
132
|
-
it "defines a with_filtered_backtrace method" do
|
133
|
-
expect(result.with_filtered_backtrace(double("filter"))).to eql result
|
134
|
-
end
|
135
|
-
|
136
|
-
specify { expect( result.to_sym ).to eq :unknown }
|
137
|
-
|
138
|
-
specify { expect( result ).not_to be_passed }
|
139
|
-
specify { expect( result ).not_to be_failed }
|
140
|
-
specify { expect( result ).not_to be_undefined }
|
141
|
-
specify { expect( result ).to be_unknown }
|
142
|
-
specify { expect( result ).not_to be_skipped }
|
143
|
-
specify { expect( result ).not_to be_flaky }
|
144
|
-
|
145
|
-
it "converts to a Cucumber::Message::TestResult" do
|
146
|
-
message = result.to_message
|
147
|
-
expect(message.status).to eq(Cucumber::Messages::TestStepResultStatus::UNKNOWN)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
describe Result::Raisable do
|
152
|
-
context "with or without backtrace" do
|
153
|
-
subject(:result) { Result::Raisable.new }
|
154
|
-
|
155
|
-
it "does nothing if step has no backtrace line" do
|
156
|
-
step = "does not respond_to?(:backtrace_line)"
|
157
|
-
|
158
|
-
expect( result.with_appended_backtrace(step).backtrace ).to eq(nil)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
context "without backtrace" do
|
163
|
-
subject(:result) { Result::Raisable.new }
|
164
|
-
|
165
|
-
it "set the backtrace to the backtrace line of the step" do
|
166
|
-
step = double
|
167
|
-
expect( step ).to receive(:backtrace_line).and_return("step_line")
|
168
|
-
|
169
|
-
expect( result.with_appended_backtrace(step).backtrace ).to eq(["step_line"])
|
170
|
-
end
|
171
|
-
|
172
|
-
it "does nothing when filtering the backtrace" do
|
173
|
-
expect( result.with_filtered_backtrace(double) ).to equal result
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
context "with backtrace" do
|
178
|
-
subject(:result) { Result::Raisable.new("message", 0, "backtrace") }
|
179
|
-
|
180
|
-
it "appends the backtrace line of the step" do
|
181
|
-
step = double
|
182
|
-
expect( step ).to receive(:backtrace_line).and_return("step_line")
|
183
|
-
|
184
|
-
expect( result.with_appended_backtrace(step).backtrace ).to eq(["backtrace", "step_line"])
|
185
|
-
end
|
186
|
-
|
187
|
-
it "apply filters to the backtrace" do
|
188
|
-
filter_class = double
|
189
|
-
filter = double
|
190
|
-
filtered_result = double
|
191
|
-
expect( filter_class ).to receive(:new).with(result.exception).and_return(filter)
|
192
|
-
expect( filter ).to receive(:exception).and_return(filtered_result)
|
193
|
-
|
194
|
-
expect( result.with_filtered_backtrace(filter_class) ).to equal filtered_result
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
describe Result::Undefined do
|
200
|
-
subject(:result) { Result::Undefined.new }
|
201
|
-
|
202
|
-
it "describes itself to a visitor" do
|
203
|
-
expect( visitor ).to receive(:undefined).with(args)
|
204
|
-
expect( visitor ).to receive(:duration).with(an_unknown_duration, args)
|
205
|
-
result.describe_to(visitor, args)
|
206
|
-
end
|
207
|
-
|
208
|
-
it "converts to a Cucumber::Message::TestResult" do
|
209
|
-
message = result.to_message
|
210
|
-
expect(message.status).to eq(Cucumber::Messages::TestStepResultStatus::UNDEFINED)
|
211
|
-
end
|
212
|
-
|
213
|
-
specify { expect( result.to_sym ).to eq :undefined }
|
214
|
-
|
215
|
-
specify { expect( result ).not_to be_passed }
|
216
|
-
specify { expect( result ).not_to be_failed }
|
217
|
-
specify { expect( result ).to be_undefined }
|
218
|
-
specify { expect( result ).not_to be_unknown }
|
219
|
-
specify { expect( result ).not_to be_skipped }
|
220
|
-
specify { expect( result ).not_to be_flaky }
|
221
|
-
|
222
|
-
specify { expect( result ).to be_ok }
|
223
|
-
specify { expect( result.ok? ).to be_truthy }
|
224
|
-
be_strict = Result::StrictConfiguration.new([:undefined])
|
225
|
-
specify { expect( result.ok?(be_strict) ).to be_falsey }
|
226
|
-
end
|
227
|
-
|
228
|
-
describe Result::Skipped do
|
229
|
-
subject(:result) { Result::Skipped.new }
|
230
|
-
|
231
|
-
it "describes itself to a visitor" do
|
232
|
-
expect( visitor ).to receive(:skipped).with(args)
|
233
|
-
expect( visitor ).to receive(:duration).with(an_unknown_duration, args)
|
234
|
-
result.describe_to(visitor, args)
|
235
|
-
end
|
236
|
-
|
237
|
-
it "converts to a Cucumber::Message::TestResult" do
|
238
|
-
message = result.to_message
|
239
|
-
expect(message.status).to eq(Cucumber::Messages::TestStepResultStatus::SKIPPED)
|
240
|
-
end
|
241
|
-
|
242
|
-
specify { expect( result.to_sym ).to eq :skipped }
|
243
|
-
|
244
|
-
specify { expect( result ).not_to be_passed }
|
245
|
-
specify { expect( result ).not_to be_failed }
|
246
|
-
specify { expect( result ).not_to be_undefined }
|
247
|
-
specify { expect( result ).not_to be_unknown }
|
248
|
-
specify { expect( result ).to be_skipped }
|
249
|
-
specify { expect( result ).not_to be_flaky }
|
250
|
-
|
251
|
-
specify { expect( result ).to be_ok }
|
252
|
-
specify { expect( result.ok? ).to be_truthy }
|
253
|
-
end
|
254
|
-
|
255
|
-
describe Result::Pending do
|
256
|
-
subject(:result) { Result::Pending.new }
|
257
|
-
|
258
|
-
it "describes itself to a visitor" do
|
259
|
-
expect( visitor ).to receive(:pending).with(result, args)
|
260
|
-
expect( visitor ).to receive(:duration).with(an_unknown_duration, args)
|
261
|
-
result.describe_to(visitor, args)
|
262
|
-
end
|
263
|
-
|
264
|
-
it "converts to a Cucumber::Message::TestResult" do
|
265
|
-
message = result.to_message
|
266
|
-
expect(message.status).to eq(Cucumber::Messages::TestStepResultStatus::PENDING)
|
267
|
-
end
|
268
|
-
|
269
|
-
specify { expect( result.to_sym ).to eq :pending }
|
270
|
-
|
271
|
-
specify { expect( result ).not_to be_passed }
|
272
|
-
specify { expect( result ).not_to be_failed }
|
273
|
-
specify { expect( result ).not_to be_undefined }
|
274
|
-
specify { expect( result ).not_to be_unknown }
|
275
|
-
specify { expect( result ).not_to be_skipped }
|
276
|
-
specify { expect( result ).not_to be_flaky }
|
277
|
-
specify { expect( result ).to be_pending }
|
278
|
-
|
279
|
-
specify { expect( result ).to be_ok }
|
280
|
-
specify { expect( result.ok? ).to be_truthy }
|
281
|
-
be_strict = Result::StrictConfiguration.new([:pending])
|
282
|
-
specify { expect( result.ok?(be_strict) ).to be_falsey }
|
283
|
-
end
|
284
|
-
|
285
|
-
describe Result::Flaky do
|
286
|
-
specify { expect( Result::Flaky.ok?(false) ).to be_truthy }
|
287
|
-
specify { expect( Result::Flaky.ok?(true) ).to be_falsey }
|
288
|
-
end
|
289
|
-
|
290
|
-
describe Result::StrictConfiguration do
|
291
|
-
subject(:strict_configuration) { Result::StrictConfiguration.new}
|
292
|
-
|
293
|
-
describe '#set_strict' do
|
294
|
-
context 'no type argument' do
|
295
|
-
it 'sets all result types to the setting argument' do
|
296
|
-
strict_configuration.set_strict(true)
|
297
|
-
expect( strict_configuration.strict?(:undefined) ).to be_truthy
|
298
|
-
expect( strict_configuration.strict?(:pending) ).to be_truthy
|
299
|
-
expect( strict_configuration.strict?(:flaky) ).to be_truthy
|
300
|
-
|
301
|
-
strict_configuration.set_strict(false)
|
302
|
-
expect( strict_configuration.strict?(:undefined) ).to be_falsey
|
303
|
-
expect( strict_configuration.strict?(:pending) ).to be_falsey
|
304
|
-
expect( strict_configuration.strict?(:flaky) ).to be_falsey
|
305
|
-
end
|
306
|
-
end
|
307
|
-
context 'with type argument' do
|
308
|
-
it 'sets the specified result type to the setting argument' do
|
309
|
-
strict_configuration.set_strict(true, :undefined)
|
310
|
-
expect( strict_configuration.strict?(:undefined) ).to be_truthy
|
311
|
-
expect( strict_configuration.set?(:pending) ).to be_falsey
|
312
|
-
expect( strict_configuration.set?(:flaky) ).to be_falsey
|
313
|
-
|
314
|
-
strict_configuration.set_strict(false, :undefined)
|
315
|
-
expect( strict_configuration.strict?(:undefined) ).to be_falsey
|
316
|
-
expect( strict_configuration.set?(:pending) ).to be_falsey
|
317
|
-
expect( strict_configuration.set?(:flaky) ).to be_falsey
|
318
|
-
end
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
describe '#strict?' do
|
323
|
-
context 'no type argument' do
|
324
|
-
it 'returns true if any result type is set to strict' do
|
325
|
-
strict_configuration.set_strict(false, :pending)
|
326
|
-
expect( strict_configuration.strict? ).to be_falsey
|
327
|
-
|
328
|
-
strict_configuration.set_strict(true, :flaky)
|
329
|
-
expect( strict_configuration.strict? ).to be_truthy
|
330
|
-
end
|
331
|
-
end
|
332
|
-
context 'with type argument' do
|
333
|
-
it 'returns true if the specified result type is set to strict' do
|
334
|
-
strict_configuration.set_strict(false, :pending)
|
335
|
-
strict_configuration.set_strict(true, :flaky)
|
336
|
-
|
337
|
-
expect( strict_configuration.strict?(:undefined) ).to be_falsey
|
338
|
-
expect( strict_configuration.strict?(:pending) ).to be_falsey
|
339
|
-
expect( strict_configuration.strict?(:flaky) ).to be_truthy
|
340
|
-
end
|
341
|
-
end
|
342
|
-
end
|
343
|
-
|
344
|
-
describe '#merge!' do
|
345
|
-
let(:merged_configuration) { Result::StrictConfiguration.new }
|
346
|
-
it 'sets the not default values from the argument accordingly' do
|
347
|
-
strict_configuration.set_strict(false, :undefined)
|
348
|
-
strict_configuration.set_strict(false, :pending)
|
349
|
-
strict_configuration.set_strict(true, :flaky)
|
350
|
-
merged_configuration.set_strict(true, :pending)
|
351
|
-
merged_configuration.set_strict(false, :flaky)
|
352
|
-
strict_configuration.merge!(merged_configuration)
|
353
|
-
|
354
|
-
expect( strict_configuration.strict?(:undefined) ).to be_falsey
|
355
|
-
expect( strict_configuration.strict?(:pending) ).to be_truthy
|
356
|
-
expect( strict_configuration.strict?(:flaky) ).to be_falsey
|
357
|
-
end
|
358
|
-
end
|
359
|
-
end
|
360
|
-
|
361
|
-
describe Result::Summary do
|
362
|
-
let(:summary) { Result::Summary.new }
|
363
|
-
let(:failed) { Result::Failed.new(Result::Duration.new(10), exception) }
|
364
|
-
let(:passed) { Result::Passed.new(Result::Duration.new(11)) }
|
365
|
-
let(:skipped) { Result::Skipped.new }
|
366
|
-
let(:unknown) { Result::Unknown.new }
|
367
|
-
let(:pending) { Result::Pending.new }
|
368
|
-
let(:undefined) { Result::Undefined.new }
|
369
|
-
let(:exception) { StandardError.new }
|
370
|
-
|
371
|
-
it "counts failed results" do
|
372
|
-
failed.describe_to summary
|
373
|
-
expect( summary.total_failed ).to eq 1
|
374
|
-
expect( summary.total(:failed) ).to eq 1
|
375
|
-
expect( summary.total ).to eq 1
|
376
|
-
end
|
377
|
-
|
378
|
-
it "counts passed results" do
|
379
|
-
passed.describe_to summary
|
380
|
-
expect( summary.total_passed ).to eq 1
|
381
|
-
expect( summary.total(:passed) ).to eq 1
|
382
|
-
expect( summary.total ).to eq 1
|
383
|
-
end
|
384
|
-
|
385
|
-
it "counts skipped results" do
|
386
|
-
skipped.describe_to summary
|
387
|
-
expect( summary.total_skipped ).to eq 1
|
388
|
-
expect( summary.total(:skipped) ).to eq 1
|
389
|
-
expect( summary.total ).to eq 1
|
390
|
-
end
|
391
|
-
|
392
|
-
it "counts undefined results" do
|
393
|
-
undefined.describe_to summary
|
394
|
-
expect( summary.total_undefined ).to eq 1
|
395
|
-
expect( summary.total(:undefined) ).to eq 1
|
396
|
-
expect( summary.total ).to eq 1
|
397
|
-
end
|
398
|
-
|
399
|
-
it "counts abitrary raisable results" do
|
400
|
-
flickering = Class.new(Result::Raisable) do
|
401
|
-
def describe_to(visitor, *args)
|
402
|
-
visitor.flickering(*args)
|
403
|
-
end
|
404
|
-
end
|
405
|
-
|
406
|
-
flickering.new.describe_to summary
|
407
|
-
expect( summary.total_flickering ).to eq 1
|
408
|
-
expect( summary.total(:flickering) ).to eq 1
|
409
|
-
expect( summary.total ).to eq 1
|
410
|
-
end
|
411
|
-
|
412
|
-
it "returns zero for a status where no messges have been received" do
|
413
|
-
expect( summary.total_passed ).to eq 0
|
414
|
-
expect( summary.total(:passed) ).to eq 0
|
415
|
-
expect( summary.total_ponies ).to eq 0
|
416
|
-
expect( summary.total(:ponies) ).to eq 0
|
417
|
-
end
|
418
|
-
|
419
|
-
it "doesn't count unknown results" do
|
420
|
-
unknown.describe_to summary
|
421
|
-
expect( summary.total ).to eq 0
|
422
|
-
end
|
423
|
-
|
424
|
-
it "counts combinations" do
|
425
|
-
[passed, passed, failed, skipped, undefined].each { |r| r.describe_to summary }
|
426
|
-
expect( summary.total ).to eq 5
|
427
|
-
expect( summary.total_passed ).to eq 2
|
428
|
-
expect( summary.total_failed ).to eq 1
|
429
|
-
expect( summary.total_skipped ).to eq 1
|
430
|
-
expect( summary.total_undefined ).to eq 1
|
431
|
-
end
|
432
|
-
|
433
|
-
it "records durations" do
|
434
|
-
[passed, failed].each { |r| r.describe_to summary }
|
435
|
-
expect( summary.durations[0] ).to be_duration 11
|
436
|
-
expect( summary.durations[1] ).to be_duration 10
|
437
|
-
end
|
438
|
-
|
439
|
-
it "records exceptions" do
|
440
|
-
[passed, failed].each { |r| r.describe_to summary }
|
441
|
-
expect( summary.exceptions ).to eq [exception]
|
442
|
-
end
|
443
|
-
|
444
|
-
context "ok? result" do
|
445
|
-
it "passed result is ok" do
|
446
|
-
passed.describe_to summary
|
447
|
-
expect( summary.ok? ).to be true
|
448
|
-
end
|
449
|
-
|
450
|
-
it "skipped result is ok" do
|
451
|
-
skipped.describe_to summary
|
452
|
-
expect( summary.ok? ).to be true
|
453
|
-
end
|
454
|
-
|
455
|
-
it "failed result is not ok" do
|
456
|
-
failed.describe_to summary
|
457
|
-
expect( summary.ok? ).to be false
|
458
|
-
end
|
459
|
-
|
460
|
-
it "pending result is ok if not strict" do
|
461
|
-
pending.describe_to summary
|
462
|
-
expect( summary.ok? ).to be true
|
463
|
-
be_strict = Result::StrictConfiguration.new([:pending])
|
464
|
-
expect( summary.ok?(be_strict) ).to be false
|
465
|
-
end
|
466
|
-
|
467
|
-
it "undefined result is ok if not strict" do
|
468
|
-
undefined.describe_to summary
|
469
|
-
expect( summary.ok? ).to be true
|
470
|
-
be_strict = Result::StrictConfiguration.new([:undefined])
|
471
|
-
expect( summary.ok?(be_strict) ).to be false
|
472
|
-
end
|
473
|
-
|
474
|
-
it "flaky result is ok if not strict" do
|
475
|
-
summary.flaky
|
476
|
-
expect( summary.ok? ).to be true
|
477
|
-
be_strict = Result::StrictConfiguration.new([:flaky])
|
478
|
-
expect( summary.ok?(be_strict) ).to be false
|
479
|
-
end
|
480
|
-
end
|
481
|
-
end
|
482
|
-
|
483
|
-
describe Result::Duration do
|
484
|
-
subject(:duration) { Result::Duration.new(10) }
|
485
|
-
|
486
|
-
it "#nanoseconds can be accessed in #tap" do
|
487
|
-
expect( duration.tap { |duration| @duration = duration.nanoseconds } ).to eq duration
|
488
|
-
expect( @duration ).to eq 10
|
489
|
-
end
|
490
|
-
end
|
491
|
-
|
492
|
-
describe Result::UnknownDuration do
|
493
|
-
subject(:duration) { Result::UnknownDuration.new }
|
494
|
-
|
495
|
-
it "#tap does not execute the passed block" do
|
496
|
-
expect( duration.tap { raise "tap executed block" } ).to eq duration
|
497
|
-
end
|
498
|
-
|
499
|
-
it "accessing #nanoseconds outside #tap block raises exception" do
|
500
|
-
expect { duration.nanoseconds }.to raise_error(RuntimeError)
|
501
|
-
end
|
502
|
-
end
|
503
|
-
end
|
504
|
-
end
|