cucumber-core 12.0.0 → 13.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,11 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
3
+
2
4
  require 'cucumber/core/event'
3
5
 
4
6
  module Cucumber
5
7
  module Core
6
8
  module Events
7
-
8
9
  class Envelope < Event.new(:envelope)
9
10
  attr_reader :envelope
10
11
  end
@@ -13,7 +14,6 @@ module Cucumber
13
14
  class GherkinSourceParsed < Event.new(:gherkin_document)
14
15
  # @return [GherkinDocument] the GherkinDocument Ast Node
15
16
  attr_reader :gherkin_document
16
-
17
17
  end
18
18
 
19
19
  # Signals that a Test::Step was created from a PickleStep
@@ -36,40 +36,32 @@ module Cucumber
36
36
 
37
37
  # Signals that a {Test::Case} is about to be executed
38
38
  class TestCaseStarted < Event.new(:test_case)
39
-
40
39
  # @return [Test::Case] the test case to be executed
41
40
  attr_reader :test_case
42
-
43
41
  end
44
42
 
45
43
  # Signals that a {Test::Step} is about to be executed
46
44
  class TestStepStarted < Event.new(:test_step)
47
-
48
45
  # @return [Test::Step] the test step to be executed
49
46
  attr_reader :test_step
50
-
51
47
  end
52
48
 
53
49
  # Signals that a {Test::Step} has finished executing
54
50
  class TestStepFinished < Event.new(:test_step, :result)
55
-
56
51
  # @return [Test::Step] the test step that was executed
57
52
  attr_reader :test_step
58
53
 
59
54
  # @return [Test::Result] the result of running the {Test::Step}
60
55
  attr_reader :result
61
-
62
56
  end
63
57
 
64
58
  # Signals that a {Test::Case} has finished executing
65
59
  class TestCaseFinished < Event.new(:test_case, :result)
66
-
67
60
  # @return [Test::Case] that was executed
68
61
  attr_reader :test_case
69
62
 
70
63
  # @return [Test::Result] the result of running the {Test::Step}
71
64
  attr_reader :result
72
-
73
65
  end
74
66
 
75
67
  # The registry contains all the events registered in the core,
@@ -83,7 +75,7 @@ module Cucumber
83
75
  TestCaseStarted,
84
76
  TestStepStarted,
85
77
  TestStepFinished,
86
- TestCaseFinished,
78
+ TestCaseFinished
87
79
  )
88
80
  end
89
81
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  module Core
4
-
5
5
  # Filters process test cases.
6
6
  #
7
7
  # Each filter must respond to the following protocol:
@@ -22,7 +22,6 @@ module Cucumber
22
22
  # Finally, the `done` message is sent. A filter should pass this message directly to its receiver.
23
23
  #
24
24
  module Filter
25
-
26
25
  # Utility method for quick construction of filter classes.
27
26
  #
28
27
  # @example Example usage:
@@ -70,7 +69,6 @@ module Cucumber
70
69
  args[-1] = new_receiver
71
70
  self.class.new(*args)
72
71
  end
73
-
74
72
  end
75
73
 
76
74
  if block
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'gherkin'
3
4
 
4
5
  module Cucumber
@@ -17,19 +18,8 @@ module Cucumber
17
18
  end
18
19
 
19
20
  def document(document)
20
- messages = ::Gherkin.from_source(document.uri, document.body, gherkin_options(document))
21
- messages.each do |message|
22
- event_bus.envelope(message)
23
- gherkin_query.update(message)
24
- if !message.gherkin_document.nil?
25
- event_bus.gherkin_source_parsed(message.gherkin_document)
26
- elsif !message.pickle.nil?
27
- receiver.pickle(message.pickle)
28
- elsif message.parse_error
29
- raise Core::Gherkin::ParseError.new("#{document.uri}: #{message.parse_error.message}")
30
- else
31
- raise "Unknown message: #{message.to_hash}"
32
- end
21
+ source_messages(document).each do |message|
22
+ process(message, document)
33
23
  end
34
24
  end
35
25
 
@@ -46,6 +36,44 @@ module Cucumber
46
36
  receiver.done
47
37
  self
48
38
  end
39
+
40
+ private
41
+
42
+ def source_messages(document)
43
+ ::Gherkin.from_source(document.uri, document.body, gherkin_options(document))
44
+ end
45
+
46
+ def process(message, document)
47
+ generate_envelope(message)
48
+ update_gherkin_query(message)
49
+
50
+ case type?(message)
51
+ when :gherkin_document; then event_bus.gherkin_source_parsed(message.gherkin_document)
52
+ when :pickle; then receiver.pickle(message.pickle)
53
+ when :parse_error; then raise ParseError.new("#{document.uri}: #{message.parse_error.message}")
54
+ else raise "Unknown message: #{message.to_hash}"
55
+ end
56
+ end
57
+
58
+ def generate_envelope(message)
59
+ event_bus.envelope(message)
60
+ end
61
+
62
+ def update_gherkin_query(message)
63
+ gherkin_query.update(message)
64
+ end
65
+
66
+ def type?(message)
67
+ if !message.gherkin_document.nil?
68
+ :gherkin_document
69
+ elsif !message.pickle.nil?
70
+ :pickle
71
+ elsif message.parse_error
72
+ :parse_error
73
+ else
74
+ :unknown
75
+ end
76
+ end
49
77
  end
50
78
  end
51
79
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  module Core
4
5
  module Gherkin
5
6
  module Writer
6
-
7
7
  module HasOptionsInitializer
8
8
  def self.included(base)
9
9
  base.extend HasDefaultKeyword
@@ -79,6 +79,7 @@ module Cucumber
79
79
  end
80
80
 
81
81
  private
82
+
82
83
  def elements
83
84
  @elements ||= []
84
85
  end
@@ -89,9 +90,10 @@ module Cucumber
89
90
  end
90
91
 
91
92
  private
93
+
92
94
  def element(name)
93
95
  define_method name do |*args, &source|
94
- factory_name = String(name).split("_").map(&:capitalize).join
96
+ factory_name = String(name).split('_').map(&:capitalize).join
95
97
  factory = Writer.const_get(factory_name)
96
98
  factory.new(slurp_comments, *args).tap do |builder|
97
99
  builder.instance_exec(&source) if source
@@ -106,7 +108,7 @@ module Cucumber
106
108
  module Indentation
107
109
  def self.level(number)
108
110
  Module.new do
109
- define_method :indent do |string, amount=nil|
111
+ define_method :indent do |string, amount = nil|
110
112
  amount ||= number
111
113
  return string if string.nil? || string.empty?
112
114
  (' ' * amount) + string
@@ -125,6 +127,7 @@ module Cucumber
125
127
 
126
128
  module HasDescription
127
129
  private
130
+
128
131
  def description
129
132
  options.fetch(:description, '').split("\n").map(&:strip)
130
133
  end
@@ -168,7 +171,6 @@ module Cucumber
168
171
  end
169
172
  end
170
173
  end
171
-
172
174
  end
173
175
  end
174
176
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/core/gherkin/writer/helpers'
3
4
  require 'cucumber/core/gherkin/document'
4
5
 
5
6
  module Cucumber
6
7
  module Core
7
8
  module Gherkin
8
-
9
9
  module Writer
10
10
  NEW_LINE = ''
11
11
  def gherkin(uri = nil, &source)
@@ -55,6 +55,7 @@ module Cucumber
55
55
  end
56
56
 
57
57
  private
58
+
58
59
  def language
59
60
  options[:language]
60
61
  end
@@ -86,6 +87,7 @@ module Cucumber
86
87
  elements :step
87
88
 
88
89
  private
90
+
89
91
  def statements
90
92
  prepare_statements(
91
93
  comments_statement,
@@ -107,6 +109,7 @@ module Cucumber
107
109
  elements :example, :scenario
108
110
 
109
111
  private
112
+
110
113
  def statements
111
114
  prepare_statements(
112
115
  comments_statement,
@@ -128,6 +131,7 @@ module Cucumber
128
131
  elements :step
129
132
 
130
133
  private
134
+
131
135
  def statements
132
136
  prepare_statements(
133
137
  comments_statement,
@@ -155,6 +159,7 @@ module Cucumber
155
159
  elements :step, :examples
156
160
 
157
161
  private
162
+
158
163
  def statements
159
164
  prepare_statements comments_statement, tag_statement, name_statement, description_statement
160
165
  end
@@ -174,6 +179,7 @@ module Cucumber
174
179
  end
175
180
 
176
181
  private
182
+
177
183
  def statements
178
184
  prepare_statements comments_statement, name_statement
179
185
  end
@@ -195,6 +201,7 @@ module Cucumber
195
201
  end
196
202
 
197
203
  private
204
+
198
205
  def statements
199
206
  row_statements
200
207
  end
@@ -216,13 +223,14 @@ module Cucumber
216
223
  end
217
224
 
218
225
  private
226
+
219
227
  def statements
220
228
  prepare_statements doc_string_statement
221
229
  end
222
230
 
223
231
  def doc_string_statement
224
232
  [
225
- %["""#{content_type}],
233
+ %("""#{content_type}),
226
234
  strings,
227
235
  '"""'
228
236
  ]
@@ -242,6 +250,7 @@ module Cucumber
242
250
  end
243
251
 
244
252
  private
253
+
245
254
  def statements
246
255
  prepare_statements(
247
256
  NEW_LINE,
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # Detect the platform we're running on so we can tweak behaviour
3
4
  # in various places.
4
5
  require 'rbconfig'
@@ -6,7 +7,7 @@ require 'rbconfig'
6
7
  module Cucumber
7
8
  unless defined?(Cucumber::VERSION)
8
9
  JRUBY = defined?(JRUBY_VERSION)
9
- IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == "ironruby"
10
+ IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ironruby'
10
11
  WINDOWS = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
11
12
  OS_X = RbConfig::CONFIG['host_os'] =~ /darwin/
12
13
  WINDOWS_MRI = WINDOWS && !JRUBY && !IRONRUBY
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  module Core
4
5
  module Report
@@ -12,26 +13,34 @@ module Cucumber
12
13
  subscribe_to(event_bus)
13
14
  end
14
15
 
15
- def ok?(be_strict = Test::Result::StrictConfiguration.new)
16
- test_cases.ok?(be_strict)
16
+ def ok?(strict: Test::Result::StrictConfiguration.new)
17
+ test_cases.ok?(strict: strict)
17
18
  end
18
19
 
19
20
  private
20
21
 
21
22
  def subscribe_to(event_bus)
23
+ register_test_case_finished_listener(event_bus)
24
+ register_test_step_finished_listener(event_bus)
25
+ self
26
+ end
27
+
28
+ def register_test_case_finished_listener(event_bus)
22
29
  event_bus.on(:test_case_finished) do |event|
23
30
  if event.test_case != @previous_test_case
24
31
  @previous_test_case = event.test_case
25
- event.result.describe_to test_cases
32
+ event.result.describe_to(test_cases)
26
33
  elsif event.result.passed? || event.result.skipped?
27
34
  test_cases.flaky
28
35
  test_cases.decrement_failed
29
36
  end
30
37
  end
38
+ end
39
+
40
+ def register_test_step_finished_listener(event_bus)
31
41
  event_bus.on(:test_step_finished) do |event|
32
- event.result.describe_to test_steps unless event.test_step.hook?
42
+ event.result.describe_to(test_steps) unless event.test_step.hook?
33
43
  end
34
- self
35
44
  end
36
45
  end
37
46
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/core/test/location'
3
4
  require 'cucumber/core/test/result'
4
5
  require 'cucumber/core/test/timer'
@@ -8,8 +9,8 @@ module Cucumber
8
9
  module Test
9
10
  class Action
10
11
  def initialize(location = nil, &block)
11
- raise ArgumentError, "Passing a block to execute the action is mandatory." unless block
12
- @location = location ? location : Test::Location.new(*block.source_location)
12
+ raise ArgumentError, 'Passing a block to execute the action is mandatory.' unless block
13
+ @location = location || Test::Location.new(*block.source_location)
13
14
  @block = block
14
15
  @timer = Timer.new
15
16
  end
@@ -78,7 +79,6 @@ module Cucumber
78
79
  Result::Undefined.new
79
80
  end
80
81
  end
81
-
82
82
  end
83
83
  end
84
84
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  module Core
4
5
  module Test
@@ -16,7 +17,7 @@ module Cucumber
16
17
  true
17
18
  end
18
19
 
19
- def execute(*args, &continue)
20
+ def execute(*_args, &continue)
20
21
  @timer.start
21
22
  @block.call(continue)
22
23
  Result::Unknown.new # Around hook does not know the result of the inner test steps
@@ -27,6 +28,7 @@ module Cucumber
27
28
  end
28
29
 
29
30
  private
31
+
30
32
  def failed(exception)
31
33
  Result::Failed.new(@timer.duration, exception)
32
34
  end
@@ -7,14 +7,15 @@ module Cucumber
7
7
  module Core
8
8
  module Test
9
9
  class Case
10
- attr_reader :id, :name, :test_steps, :location, :tags, :language, :around_hooks
10
+ attr_reader :id, :name, :test_steps, :location, :parent_locations, :tags, :language, :around_hooks
11
11
 
12
- def initialize(id, name, test_steps, location, tags, language, around_hooks = [])
12
+ def initialize(id, name, test_steps, location, parent_locations, tags, language, around_hooks = [])
13
13
  raise ArgumentError.new("test_steps should be an Array but is a #{test_steps.class}") unless test_steps.is_a?(Array)
14
14
  @id = id
15
15
  @name = name
16
16
  @test_steps = test_steps
17
17
  @location = location
18
+ @parent_locations = parent_locations
18
19
  @tags = tags
19
20
  @language = language
20
21
  @around_hooks = around_hooks
@@ -36,11 +37,11 @@ module Cucumber
36
37
  end
37
38
 
38
39
  def with_steps(test_steps)
39
- self.class.new(id, name, test_steps, location, tags, language, around_hooks)
40
+ self.class.new(id, name, test_steps, location, parent_locations, tags, language, around_hooks)
40
41
  end
41
42
 
42
43
  def with_around_hooks(around_hooks)
43
- self.class.new(id, name, test_steps, location, tags, language, around_hooks)
44
+ self.class.new(id, name, test_steps, location, parent_locations, tags, language, around_hooks)
44
45
  end
45
46
 
46
47
  def match_tags?(*expressions)
@@ -61,6 +62,7 @@ module Cucumber
61
62
 
62
63
  def matching_locations
63
64
  [
65
+ parent_locations,
64
66
  location,
65
67
  tags.map(&:location),
66
68
  test_steps.map(&:matching_locations)
@@ -95,11 +95,9 @@ module Cucumber
95
95
  private
96
96
 
97
97
  def verify_rows_are_same_length(raw)
98
- begin
99
- raw.transpose
100
- rescue IndexError
101
- raise ArgumentError, "Rows must all be the same length"
102
- end
98
+ raw.transpose
99
+ rescue IndexError
100
+ raise ArgumentError, 'Rows must all be the same length'
103
101
  end
104
102
 
105
103
  def ensure_array_of_array(array)
@@ -108,9 +106,8 @@ module Cucumber
108
106
 
109
107
  def hashes_to_array(hashes)
110
108
  header = hashes[0].keys.sort
111
- [header] + hashes.map {|hash| header.map {|key| hash[key]}}
109
+ [header] + hashes.map { |hash| header.map { |key| hash[key] } }
112
110
  end
113
-
114
111
  end
115
112
  end
116
113
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'delegate'
3
4
  module Cucumber
4
5
  module Core
@@ -41,7 +42,7 @@ module Cucumber
41
42
  end
42
43
 
43
44
  def map
44
- raise ArgumentError, "No block given" unless block_given?
45
+ raise ArgumentError, 'No block given' unless block_given?
45
46
  new_content = yield content
46
47
  self.class.new(new_content, content_type)
47
48
  end
@@ -66,10 +67,10 @@ module Cucumber
66
67
 
67
68
  def inspect
68
69
  [
69
- %{#<#{self.class}},
70
- %{ """#{content_type}},
71
- %{ #{@content}},
72
- %{ """>}
70
+ %(#<#{self.class}),
71
+ %( """#{content_type}),
72
+ %( #{@content}),
73
+ %( """>)
73
74
  ].join("\n")
74
75
  end
75
76
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
4
  module Core
4
5
  module Test
@@ -15,7 +16,7 @@ module Cucumber
15
16
  false
16
17
  end
17
18
 
18
- def map(&block)
19
+ def map
19
20
  self
20
21
  end
21
22
 
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module Core
3
5
  module Test
4
6
  module Filters
5
-
6
7
  # This filter is used for testing Cucumber itself. It adds step definitions
7
8
  # that will activate steps to have passed / failed / pending results
8
9
  # if they use conventional names.
@@ -19,7 +20,7 @@ module Cucumber
19
20
  when /pending/
20
21
  step.with_action { raise Test::Result::Pending }
21
22
  when /pass/
22
- step.with_action {}
23
+ step.with_action { :no_op }
23
24
  else
24
25
  step
25
26
  end
@@ -28,7 +29,6 @@ module Cucumber
28
29
  test_case.with_steps(test_steps).describe_to(receiver)
29
30
  end
30
31
  end
31
-
32
32
  end
33
33
  end
34
34
  end
@@ -1,13 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/core/filter'
3
4
 
4
5
  module Cucumber
5
6
  module Core
6
7
  module Test
7
-
8
8
  # Sorts and filters scenarios based on a list of locations
9
9
  class LocationsFilter < Filter.new(:filter_locations)
10
-
11
10
  def test_case(test_case)
12
11
  test_cases[test_case.location.file] << test_case
13
12
  self
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/core/filter'
3
4
 
4
5
  module Cucumber
5
6
  module Core
6
7
  module Test
7
8
  class NameFilter < Filter.new(:name_regexps)
8
-
9
9
  def test_case(test_case)
10
10
  if accept?(test_case)
11
11
  test_case.describe_to(receiver)
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/core/filter'
3
4
 
4
5
  module Cucumber
5
6
  module Core
6
7
  module Test
7
8
  class TagFilter < Filter.new(:filter_expressions)
8
-
9
9
  def test_case(test_case)
10
10
  test_cases << test_case
11
11
  if test_case.match_tags?(filter_expressions)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/core/test/filters/locations_filter'
3
4
  require 'cucumber/core/test/filters/name_filter'
4
5
  require 'cucumber/core/test/filters/tag_filter'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'forwardable'
3
4
  require 'cucumber/core/platform'
4
5
  module Cucumber
@@ -7,7 +8,6 @@ module Cucumber
7
8
  IncompatibleLocations = Class.new(StandardError)
8
9
 
9
10
  module Location
10
-
11
11
  def self.of_caller(additional_depth = 0)
12
12
  from_file_colon_line(*caller[1 + additional_depth])
13
13
  end
@@ -30,7 +30,7 @@ module Cucumber
30
30
  end
31
31
 
32
32
  def self.new(file, raw_lines=nil)
33
- file || raise(ArgumentError, "file is mandatory")
33
+ file || raise(ArgumentError, 'file is mandatory')
34
34
  if raw_lines
35
35
  Precise.new(file, Lines.new(raw_lines))
36
36
  else
@@ -47,7 +47,7 @@ module Cucumber
47
47
  other.file == file
48
48
  end
49
49
 
50
- def include?(lines)
50
+ def include?(_lines)
51
51
  true
52
52
  end
53
53
  end
@@ -68,7 +68,7 @@ module Cucumber
68
68
  end
69
69
 
70
70
  def to_s
71
- [file, lines.to_s].join(":")
71
+ [file, lines.to_s].join(':')
72
72
  end
73
73
 
74
74
  def hash
@@ -91,7 +91,7 @@ module Cucumber
91
91
  end
92
92
 
93
93
  def inspect
94
- "<#{self.class}: #{to_s}>"
94
+ "<#{self.class}: #{self}>"
95
95
  end
96
96
  end
97
97
 
@@ -128,7 +128,7 @@ module Cucumber
128
128
  return first.to_s if data.length == 1
129
129
  return "#{data.min}..#{data.max}" if range?
130
130
 
131
- data.to_a.join(":")
131
+ data.to_a.join(':')
132
132
  end
133
133
 
134
134
  def inspect
@@ -180,7 +180,6 @@ module Cucumber
180
180
  # will be overriden by nodes that actually have a multiline_argument
181
181
  Test::EmptyMultilineArgument.new
182
182
  end
183
-
184
183
  end
185
184
  end
186
185
  end