cucumber-core 3.0.0 → 3.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/lib/cucumber/core/version.rb +1 -1
- metadata +19 -85
- data/.coveralls.yml +0 -1
- data/.github/ISSUE_TEMPLATE.md +0 -48
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -39
- data/.rspec +0 -1
- data/.ruby-gemset +0 -1
- data/.travis.yml +0 -30
- data/.yardopts +0 -6
- data/Gemfile +0 -2
- data/Rakefile +0 -28
- data/cucumber-core.gemspec +0 -36
- data/spec/capture_warnings.rb +0 -74
- data/spec/coverage.rb +0 -11
- data/spec/cucumber/core/ast/background_spec.rb +0 -11
- data/spec/cucumber/core/ast/data_table_spec.rb +0 -81
- data/spec/cucumber/core/ast/doc_string_spec.rb +0 -114
- data/spec/cucumber/core/ast/empty_multiline_argument_spec.rb +0 -28
- data/spec/cucumber/core/ast/examples_table_spec.rb +0 -113
- data/spec/cucumber/core/ast/location_spec.rb +0 -199
- data/spec/cucumber/core/ast/outline_step_spec.rb +0 -93
- data/spec/cucumber/core/ast/step_spec.rb +0 -174
- data/spec/cucumber/core/compiler_spec.rb +0 -267
- 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 -261
- data/spec/cucumber/core/gherkin/writer_spec.rb +0 -333
- data/spec/cucumber/core/report/summary_spec.rb +0 -175
- data/spec/cucumber/core/test/action_spec.rb +0 -154
- data/spec/cucumber/core/test/case_spec.rb +0 -316
- data/spec/cucumber/core/test/duration_matcher.rb +0 -20
- data/spec/cucumber/core/test/filters/locations_filter_spec.rb +0 -405
- data/spec/cucumber/core/test/result_spec.rb +0 -474
- data/spec/cucumber/core/test/runner_spec.rb +0 -310
- data/spec/cucumber/core/test/step_spec.rb +0 -98
- data/spec/cucumber/core/test/timer_spec.rb +0 -25
- data/spec/cucumber/core_spec.rb +0 -262
- data/spec/readme_spec.rb +0 -37
- data/spec/report_api_spy.rb +0 -25
@@ -1,154 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'cucumber/core/test/action'
|
3
|
-
require 'cucumber/core/test/duration_matcher'
|
4
|
-
|
5
|
-
module Cucumber
|
6
|
-
module Core
|
7
|
-
module Test
|
8
|
-
|
9
|
-
describe Action do
|
10
|
-
|
11
|
-
context "constructed without a block" do
|
12
|
-
it "raises an error" do
|
13
|
-
expect { Action.new }.to raise_error(ArgumentError)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context "location" do
|
18
|
-
|
19
|
-
context "with location passed to the constructor" do
|
20
|
-
let(:location) { double }
|
21
|
-
|
22
|
-
it "returns the location passed to the constructor" do
|
23
|
-
action = Action.new(location) {}
|
24
|
-
expect( action.location ).to be location
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context "without location passed to the constructor" do
|
29
|
-
let(:block) { proc {} }
|
30
|
-
|
31
|
-
it "returns the location of the block passed to the constructor" do
|
32
|
-
action = Action.new(&block)
|
33
|
-
expect( action.location ).to eq Ast::Location.new(*block.source_location)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
context "executing" do
|
40
|
-
it "executes the block passed to the constructor" do
|
41
|
-
executed = false
|
42
|
-
action = Action.new { executed = true }
|
43
|
-
action.execute
|
44
|
-
expect( executed ).to be_truthy
|
45
|
-
end
|
46
|
-
|
47
|
-
it "returns a passed result if the block doesn't fail" do
|
48
|
-
action = Action.new {}
|
49
|
-
expect( action.execute ).to be_passed
|
50
|
-
end
|
51
|
-
|
52
|
-
it "returns a failed result when the block raises an error" do
|
53
|
-
exception = StandardError.new
|
54
|
-
action = Action.new { raise exception }
|
55
|
-
result = action.execute
|
56
|
-
expect( result ).to be_failed
|
57
|
-
expect( result.exception ).to eq exception
|
58
|
-
end
|
59
|
-
|
60
|
-
it "yields the args passed to #execute to the block" do
|
61
|
-
args = [double, double]
|
62
|
-
args_spy = nil
|
63
|
-
action = Action.new { |arg1, arg2| args_spy = [arg1, arg2] }
|
64
|
-
action.execute(*args)
|
65
|
-
expect(args_spy).to eq args
|
66
|
-
end
|
67
|
-
|
68
|
-
it "returns a pending result if a Result::Pending error is raised" do
|
69
|
-
exception = Result::Pending.new("TODO")
|
70
|
-
action = Action.new { raise exception }
|
71
|
-
result = action.execute
|
72
|
-
expect( result ).to be_pending
|
73
|
-
expect( result.message ).to eq "TODO"
|
74
|
-
end
|
75
|
-
|
76
|
-
it "returns a skipped result if a Result::Skipped error is raised" do
|
77
|
-
exception = Result::Skipped.new("Not working right now")
|
78
|
-
action = Action.new { raise exception }
|
79
|
-
result = action.execute
|
80
|
-
expect( result ).to be_skipped
|
81
|
-
expect( result.message ).to eq "Not working right now"
|
82
|
-
end
|
83
|
-
|
84
|
-
it "returns an undefined result if a Result::Undefined error is raised" do
|
85
|
-
exception = Result::Undefined.new("new step")
|
86
|
-
action = Action.new { raise exception }
|
87
|
-
result = action.execute
|
88
|
-
expect( result ).to be_undefined
|
89
|
-
expect( result.message ).to eq "new step"
|
90
|
-
end
|
91
|
-
|
92
|
-
context "recording the duration" do
|
93
|
-
before do
|
94
|
-
allow( Timer::MonotonicTime ).to receive(:time_in_nanoseconds).and_return(525702744080000, 525702744080001)
|
95
|
-
end
|
96
|
-
|
97
|
-
it "records the nanoseconds duration of the execution on the result" do
|
98
|
-
action = Action.new { }
|
99
|
-
duration = action.execute.duration
|
100
|
-
expect( duration ).to be_duration 1
|
101
|
-
end
|
102
|
-
|
103
|
-
it "records the duration of a failed execution" do
|
104
|
-
action = Action.new { raise StandardError }
|
105
|
-
duration = action.execute.duration
|
106
|
-
expect( duration ).to be_duration 1
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
context "skipping" do
|
113
|
-
it "does not execute the block" do
|
114
|
-
executed = false
|
115
|
-
action = Action.new { executed = true }
|
116
|
-
action.skip
|
117
|
-
expect( executed ).to be_falsey
|
118
|
-
end
|
119
|
-
|
120
|
-
it "returns a skipped result" do
|
121
|
-
action = Action.new {}
|
122
|
-
expect( action.skip ).to be_skipped
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
describe UndefinedAction do
|
128
|
-
let(:location) { double }
|
129
|
-
let(:action) { UndefinedAction.new(location) }
|
130
|
-
let(:test_step) { double }
|
131
|
-
|
132
|
-
context "location" do
|
133
|
-
it "returns the location passed to the constructor" do
|
134
|
-
expect( action.location ).to be location
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context "executing" do
|
139
|
-
it "returns an undefined result" do
|
140
|
-
expect( action.execute ).to be_undefined
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
context "skipping" do
|
145
|
-
it "returns an undefined result" do
|
146
|
-
expect( action.skip ).to be_undefined
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
@@ -1,316 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
require 'cucumber/core'
|
4
|
-
require 'cucumber/core/gherkin/writer'
|
5
|
-
require 'cucumber/core/platform'
|
6
|
-
require 'cucumber/core/test/case'
|
7
|
-
require 'unindent'
|
8
|
-
|
9
|
-
module Cucumber
|
10
|
-
module Core
|
11
|
-
module Test
|
12
|
-
describe Case do
|
13
|
-
include Core
|
14
|
-
include Core::Gherkin::Writer
|
15
|
-
|
16
|
-
let(:test_case) { Test::Case.new(test_steps, [feature, scenario]) }
|
17
|
-
let(:feature) { double(location: "features/test.feature:1") }
|
18
|
-
let(:scenario) { double(location: "features/test.feature:2") }
|
19
|
-
let(:test_steps) { [double, double] }
|
20
|
-
|
21
|
-
context 'describing itself' do
|
22
|
-
it "describes itself to a visitor" do
|
23
|
-
visitor = double
|
24
|
-
args = double
|
25
|
-
expect( visitor ).to receive(:test_case).with(test_case, args)
|
26
|
-
test_case.describe_to(visitor, args)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "asks each test_step to describe themselves to the visitor" do
|
30
|
-
visitor = double
|
31
|
-
args = double
|
32
|
-
test_steps.each do |test_step|
|
33
|
-
expect( test_step ).to receive(:describe_to).with(visitor, args)
|
34
|
-
end
|
35
|
-
allow( visitor ).to receive(:test_case).and_yield(visitor)
|
36
|
-
test_case.describe_to(visitor, args)
|
37
|
-
end
|
38
|
-
|
39
|
-
it "describes around hooks in order" do
|
40
|
-
visitor = double
|
41
|
-
allow( visitor ).to receive(:test_case).and_yield(visitor)
|
42
|
-
first_hook, second_hook = double, double
|
43
|
-
expect( first_hook ).to receive(:describe_to).ordered.and_yield
|
44
|
-
expect( second_hook ).to receive(:describe_to).ordered.and_yield
|
45
|
-
around_hooks = [first_hook, second_hook]
|
46
|
-
Test::Case.new([], [], around_hooks).describe_to(visitor, double)
|
47
|
-
end
|
48
|
-
|
49
|
-
it "describes its source to a visitor" do
|
50
|
-
visitor = double
|
51
|
-
args = double
|
52
|
-
expect( feature ).to receive(:describe_to).with(visitor, args)
|
53
|
-
expect( scenario ).to receive(:describe_to).with(visitor, args)
|
54
|
-
test_case.describe_source_to(visitor, args)
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "#name" do
|
60
|
-
context "created from a scenario" do
|
61
|
-
it "takes its name from the name of a scenario" do
|
62
|
-
gherkin = gherkin do
|
63
|
-
feature do
|
64
|
-
scenario 'Scenario name' do
|
65
|
-
step 'passing'
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
receiver = double.as_null_object
|
70
|
-
|
71
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
72
|
-
expect( test_case.name ).to eq 'Scenario name'
|
73
|
-
expect( test_case.keyword ).to eq 'Scenario'
|
74
|
-
end
|
75
|
-
compile([gherkin], receiver)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context "created from a scenario outline example" do
|
80
|
-
it "takes its name from the name of the scenario outline and examples table" do
|
81
|
-
gherkin = gherkin do
|
82
|
-
feature do
|
83
|
-
scenario_outline 'outline name' do
|
84
|
-
step 'passing with arg'
|
85
|
-
|
86
|
-
examples 'examples name' do
|
87
|
-
row 'arg'
|
88
|
-
row 'a'
|
89
|
-
row 'b'
|
90
|
-
end
|
91
|
-
|
92
|
-
examples '' do
|
93
|
-
row 'arg'
|
94
|
-
row 'c'
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
receiver = double.as_null_object
|
100
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
101
|
-
expect( test_case.name ).to eq 'outline name, examples name (#1)'
|
102
|
-
expect( test_case.keyword ).to eq 'Scenario Outline'
|
103
|
-
end.once.ordered
|
104
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
105
|
-
expect( test_case.name ).to eq 'outline name, examples name (#2)'
|
106
|
-
end.once.ordered
|
107
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
108
|
-
expect( test_case.name ).to eq 'outline name, Examples (#1)'
|
109
|
-
end.once.ordered
|
110
|
-
compile [gherkin], receiver
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
describe "#location" do
|
116
|
-
context "created from a scenario" do
|
117
|
-
it "takes its location from the location of the scenario" do
|
118
|
-
gherkin = gherkin('features/foo.feature') do
|
119
|
-
feature do
|
120
|
-
scenario do
|
121
|
-
step
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
receiver = double.as_null_object
|
126
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
127
|
-
expect( test_case.location.to_s ).to eq 'features/foo.feature:3'
|
128
|
-
end
|
129
|
-
compile([gherkin], receiver)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
context "created from a scenario outline example" do
|
134
|
-
it "takes its location from the location of the scenario outline example row" do
|
135
|
-
gherkin = gherkin('features/foo.feature') do
|
136
|
-
feature do
|
137
|
-
scenario_outline do
|
138
|
-
step 'passing with arg'
|
139
|
-
|
140
|
-
examples do
|
141
|
-
row 'arg'
|
142
|
-
row '1'
|
143
|
-
row '2'
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
receiver = double.as_null_object
|
149
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
150
|
-
expect( test_case.location.to_s ).to eq 'features/foo.feature:8'
|
151
|
-
end.once.ordered
|
152
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
153
|
-
expect( test_case.location.to_s ).to eq 'features/foo.feature:9'
|
154
|
-
end.once.ordered
|
155
|
-
compile [gherkin], receiver
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
describe "#tags" do
|
161
|
-
it "includes all tags from the parent feature" do
|
162
|
-
gherkin = gherkin do
|
163
|
-
feature tags: ['@a', '@b'] do
|
164
|
-
scenario tags: ['@c'] do
|
165
|
-
step
|
166
|
-
end
|
167
|
-
scenario_outline tags: ['@d'] do
|
168
|
-
step 'passing with arg'
|
169
|
-
examples tags: ['@e'] do
|
170
|
-
row 'arg'
|
171
|
-
row 'x'
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
receiver = double.as_null_object
|
177
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
178
|
-
expect( test_case.tags.map(&:name) ).to eq ['@a', '@b', '@c']
|
179
|
-
end.once.ordered
|
180
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
181
|
-
expect( test_case.tags.map(&:name) ).to eq ['@a', '@b', '@d', '@e']
|
182
|
-
end.once.ordered
|
183
|
-
compile [gherkin], receiver
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
describe "matching tags" do
|
188
|
-
it "matches tags using tag expressions" do
|
189
|
-
gherkin = gherkin do
|
190
|
-
feature tags: ['@a', '@b'] do
|
191
|
-
scenario tags: ['@c'] do
|
192
|
-
step
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
196
|
-
receiver = double.as_null_object
|
197
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
198
|
-
expect( test_case.match_tags?(['@a and @b']) ).to be_truthy
|
199
|
-
expect( test_case.match_tags?(['@a or @d']) ).to be_truthy
|
200
|
-
expect( test_case.match_tags?(['not @d']) ).to be_truthy
|
201
|
-
expect( test_case.match_tags?(['@a and @d']) ).to be_falsy
|
202
|
-
end
|
203
|
-
compile [gherkin], receiver
|
204
|
-
end
|
205
|
-
|
206
|
-
it "matches handles multiple expressions" do
|
207
|
-
gherkin = gherkin do
|
208
|
-
feature tags: ['@a', '@b'] do
|
209
|
-
scenario tags: ['@c'] do
|
210
|
-
step
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|
214
|
-
receiver = double.as_null_object
|
215
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
216
|
-
expect( test_case.match_tags?(['@a and @b', 'not @d']) ).to be_truthy
|
217
|
-
expect( test_case.match_tags?(['@a and @b', 'not @c']) ).to be_falsy
|
218
|
-
end
|
219
|
-
compile [gherkin], receiver
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
describe "matching tags (old style)" do
|
224
|
-
it "matches boolean expressions of tags" do
|
225
|
-
gherkin = gherkin do
|
226
|
-
feature tags: ['@a', '@b'] do
|
227
|
-
scenario tags: ['@c'] do
|
228
|
-
step
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|
232
|
-
receiver = double.as_null_object
|
233
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
234
|
-
expect( test_case.match_tags?(['@a', '@b']) ).to be_truthy
|
235
|
-
expect( test_case.match_tags?(['@a, @d']) ).to be_truthy
|
236
|
-
expect( test_case.match_tags?(['~@d']) ).to be_truthy
|
237
|
-
expect( test_case.match_tags?(['@a', '@d']) ).to be_falsy
|
238
|
-
end
|
239
|
-
compile [gherkin], receiver
|
240
|
-
end
|
241
|
-
|
242
|
-
it "handles mixing old and new style expressions" do
|
243
|
-
gherkin = gherkin do
|
244
|
-
feature tags: ['@a', '@b'] do
|
245
|
-
scenario tags: ['@c'] do
|
246
|
-
step
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|
250
|
-
receiver = double.as_null_object
|
251
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
252
|
-
expect( test_case.match_tags?(['@a and @b', '~@d']) ).to be_truthy
|
253
|
-
end
|
254
|
-
compile [gherkin], receiver
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
describe "matching names" do
|
259
|
-
it "matches names against regexp" do
|
260
|
-
gherkin = gherkin do
|
261
|
-
feature 'first feature' do
|
262
|
-
scenario 'scenario' do
|
263
|
-
step 'missing'
|
264
|
-
end
|
265
|
-
end
|
266
|
-
end
|
267
|
-
receiver = double.as_null_object
|
268
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
269
|
-
expect( test_case.match_name?(/feature/) ).to be_truthy
|
270
|
-
end
|
271
|
-
compile [gherkin], receiver
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
describe "#language" do
|
276
|
-
it 'takes its language from the feature' do
|
277
|
-
gherkin = Gherkin::Document.new('features/treasure.feature', %{# language: en-pirate
|
278
|
-
Ahoy matey!: Treasure map
|
279
|
-
Heave to: Find the treasure
|
280
|
-
Gangway! a map
|
281
|
-
})
|
282
|
-
receiver = double.as_null_object
|
283
|
-
expect( receiver ).to receive(:test_case) do |test_case|
|
284
|
-
expect( test_case.language.iso_code ).to eq 'en-pirate'
|
285
|
-
end
|
286
|
-
compile([gherkin], receiver)
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
describe "equality" do
|
291
|
-
it "is equal to another test case at the same location" do
|
292
|
-
gherkin = gherkin('features/foo.feature') do
|
293
|
-
feature do
|
294
|
-
scenario do
|
295
|
-
step
|
296
|
-
end
|
297
|
-
end
|
298
|
-
end
|
299
|
-
test_case_instances = []
|
300
|
-
receiver = double.as_null_object
|
301
|
-
allow(receiver).to receive(:test_case) do |test_case|
|
302
|
-
test_case_instances << test_case
|
303
|
-
end
|
304
|
-
2.times { compile([gherkin], receiver) }
|
305
|
-
expect(test_case_instances.length).to eq 2
|
306
|
-
expect(test_case_instances.uniq.length).to eq 1
|
307
|
-
expect(test_case_instances[0]).to be_eql test_case_instances[1]
|
308
|
-
expect(test_case_instances[0]).to eq test_case_instances[1]
|
309
|
-
expect(test_case_instances[0]).not_to equal test_case_instances[1]
|
310
|
-
end
|
311
|
-
end
|
312
|
-
|
313
|
-
end
|
314
|
-
end
|
315
|
-
end
|
316
|
-
end
|