cucumber 3.0.2 → 4.0.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 +5 -5
- data/CHANGELOG.md +216 -17
- data/CONTRIBUTING.md +4 -21
- data/README.md +8 -10
- data/bin/cucumber +1 -1
- data/lib/autotest/cucumber.rb +1 -0
- data/lib/autotest/cucumber_mixin.rb +35 -39
- data/lib/autotest/cucumber_rails.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
- data/lib/autotest/cucumber_rspec.rb +1 -0
- data/lib/autotest/cucumber_rspec2.rb +1 -0
- data/lib/autotest/discover.rb +1 -0
- data/lib/cucumber.rb +2 -1
- data/lib/cucumber/cli/configuration.rb +6 -5
- data/lib/cucumber/cli/main.rb +14 -14
- data/lib/cucumber/cli/options.rb +113 -116
- data/lib/cucumber/cli/profile_loader.rb +50 -29
- data/lib/cucumber/cli/rerun_file.rb +1 -0
- data/lib/cucumber/configuration.rb +38 -29
- data/lib/cucumber/constantize.rb +8 -10
- data/lib/cucumber/core_ext/string.rb +1 -0
- data/lib/cucumber/deprecate.rb +32 -8
- data/lib/cucumber/encoding.rb +2 -1
- data/lib/cucumber/errors.rb +6 -7
- data/lib/cucumber/events.rb +14 -7
- data/lib/cucumber/events/envelope.rb +9 -0
- data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
- data/lib/cucumber/events/gherkin_source_read.rb +1 -4
- data/lib/cucumber/events/hook_test_step_created.rb +13 -0
- data/lib/cucumber/events/step_activated.rb +6 -6
- data/lib/cucumber/events/step_definition_registered.rb +4 -8
- data/lib/cucumber/events/test_case_created.rb +13 -0
- data/lib/cucumber/events/test_case_finished.rb +0 -4
- data/lib/cucumber/events/test_case_ready.rb +12 -0
- data/lib/cucumber/events/test_case_started.rb +0 -4
- data/lib/cucumber/events/test_run_finished.rb +2 -3
- data/lib/cucumber/events/test_run_started.rb +2 -4
- data/lib/cucumber/events/test_step_created.rb +13 -0
- data/lib/cucumber/events/test_step_finished.rb +0 -4
- data/lib/cucumber/events/test_step_started.rb +1 -5
- data/lib/cucumber/events/undefined_parameter_type.rb +10 -0
- data/lib/cucumber/file_specs.rb +7 -6
- data/lib/cucumber/filters.rb +2 -0
- data/lib/cucumber/filters/activate_steps.rb +6 -4
- data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
- data/lib/cucumber/filters/broadcast_test_case_ready_event.rb +12 -0
- data/lib/cucumber/filters/broadcast_test_run_started_event.rb +2 -1
- data/lib/cucumber/filters/gated_receiver.rb +1 -2
- data/lib/cucumber/filters/prepare_world.rb +6 -13
- data/lib/cucumber/filters/quit.rb +3 -6
- data/lib/cucumber/filters/randomizer.rb +6 -7
- data/lib/cucumber/filters/retry.rb +2 -2
- data/lib/cucumber/filters/tag_limits.rb +2 -2
- data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
- data/lib/cucumber/filters/tag_limits/verifier.rb +3 -6
- data/lib/cucumber/formatter/ansicolor.rb +33 -37
- data/lib/cucumber/formatter/ast_lookup.rb +165 -0
- data/lib/cucumber/formatter/backtrace_filter.rb +10 -10
- data/lib/cucumber/formatter/console.rb +65 -74
- data/lib/cucumber/formatter/console_counts.rb +4 -9
- data/lib/cucumber/formatter/console_issues.rb +9 -6
- data/lib/cucumber/formatter/duration.rb +2 -1
- data/lib/cucumber/formatter/duration_extractor.rb +4 -2
- data/lib/cucumber/formatter/errors.rb +6 -0
- data/lib/cucumber/formatter/fail_fast.rb +9 -6
- data/lib/cucumber/formatter/fanout.rb +3 -3
- data/lib/cucumber/formatter/html.rb +11 -602
- data/lib/cucumber/formatter/http_io.rb +146 -0
- data/lib/cucumber/formatter/ignore_missing_messages.rb +2 -3
- data/lib/cucumber/formatter/interceptor.rb +11 -18
- data/lib/cucumber/formatter/io.rb +18 -11
- data/lib/cucumber/formatter/json.rb +102 -109
- data/lib/cucumber/formatter/junit.rb +73 -68
- data/lib/cucumber/formatter/message.rb +22 -0
- data/lib/cucumber/formatter/message_builder.rb +255 -0
- data/lib/cucumber/formatter/pretty.rb +360 -153
- data/lib/cucumber/formatter/progress.rb +31 -32
- data/lib/cucumber/formatter/query/hook_by_test_step.rb +31 -0
- data/lib/cucumber/formatter/query/pickle_by_test.rb +26 -0
- data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +26 -0
- data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +40 -0
- data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +40 -0
- data/lib/cucumber/formatter/rerun.rb +23 -4
- data/lib/cucumber/formatter/stepdefs.rb +2 -2
- data/lib/cucumber/formatter/steps.rb +4 -5
- data/lib/cucumber/formatter/summary.rb +17 -9
- data/lib/cucumber/formatter/unicode.rb +16 -18
- data/lib/cucumber/formatter/usage.rb +30 -26
- data/lib/cucumber/gherkin/data_table_parser.rb +18 -6
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +83 -86
- data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
- data/lib/cucumber/gherkin/i18n.rb +1 -0
- data/lib/cucumber/gherkin/steps_parser.rb +18 -8
- data/lib/cucumber/glue/dsl.rb +2 -1
- data/lib/cucumber/glue/hook.rb +35 -11
- data/lib/cucumber/glue/invoke_in_world.rb +15 -20
- data/lib/cucumber/glue/proto_world.rb +47 -39
- data/lib/cucumber/glue/registry_and_more.rb +54 -23
- data/lib/cucumber/glue/snippet.rb +24 -27
- data/lib/cucumber/glue/step_definition.rb +51 -28
- data/lib/cucumber/glue/world_factory.rb +1 -3
- data/lib/cucumber/hooks.rb +24 -14
- data/lib/cucumber/load_path.rb +1 -0
- data/lib/cucumber/multiline_argument.rb +6 -8
- data/lib/cucumber/multiline_argument/data_table.rb +106 -73
- data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +8 -11
- data/lib/cucumber/multiline_argument/doc_string.rb +2 -1
- data/lib/cucumber/platform.rb +4 -3
- data/lib/cucumber/project_initializer.rb +1 -1
- data/lib/cucumber/rake/task.rb +21 -18
- data/lib/cucumber/rspec/disable_option_parser.rb +10 -8
- data/lib/cucumber/rspec/doubles.rb +1 -0
- data/lib/cucumber/running_test_case.rb +4 -54
- data/lib/cucumber/runtime.rb +57 -61
- data/lib/cucumber/runtime/after_hooks.rb +9 -4
- data/lib/cucumber/runtime/before_hooks.rb +9 -4
- data/lib/cucumber/runtime/for_programming_languages.rb +12 -9
- data/lib/cucumber/runtime/step_hooks.rb +5 -2
- data/lib/cucumber/runtime/support_code.rb +16 -22
- data/lib/cucumber/runtime/user_interface.rb +8 -19
- data/lib/cucumber/step_definition_light.rb +6 -4
- data/lib/cucumber/step_definitions.rb +3 -2
- data/lib/cucumber/step_match.rb +20 -18
- data/lib/cucumber/step_match_search.rb +9 -9
- data/lib/cucumber/term/ansicolor.rb +39 -39
- data/lib/cucumber/unit.rb +1 -0
- data/lib/cucumber/version +1 -1
- data/lib/simplecov_setup.rb +1 -0
- metadata +214 -127
- data/lib/cucumber/formatter/cucumber.css +0 -286
- data/lib/cucumber/formatter/cucumber.sass +0 -247
- data/lib/cucumber/formatter/hook_query_visitor.rb +0 -41
- data/lib/cucumber/formatter/html_builder.rb +0 -120
- data/lib/cucumber/formatter/inline-js.js +0 -30
- data/lib/cucumber/formatter/jquery-min.js +0 -154
- data/lib/cucumber/formatter/json_pretty.rb +0 -10
- data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1028
- data/lib/cucumber/formatter/legacy_api/ast.rb +0 -394
- data/lib/cucumber/formatter/legacy_api/results.rb +0 -50
- data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -32
- data/lib/cucumber/step_argument.rb +0 -24
@@ -1,24 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Cucumber
|
3
4
|
class Runtime
|
4
5
|
class AfterHooks
|
5
|
-
def initialize(hooks, scenario)
|
6
|
+
def initialize(id_generator, hooks, scenario, event_bus)
|
6
7
|
@hooks = hooks
|
7
8
|
@scenario = scenario
|
9
|
+
@id_generator = id_generator
|
10
|
+
@event_bus = event_bus
|
8
11
|
end
|
9
12
|
|
10
13
|
def apply_to(test_case)
|
11
14
|
test_case.with_steps(
|
12
|
-
test_case.test_steps + after_hooks
|
15
|
+
test_case.test_steps + after_hooks.reverse
|
13
16
|
)
|
14
17
|
end
|
15
18
|
|
16
19
|
private
|
17
20
|
|
18
|
-
def after_hooks
|
21
|
+
def after_hooks
|
19
22
|
@hooks.map do |hook|
|
20
23
|
action = ->(result) { hook.invoke('After', @scenario.with_result(result)) }
|
21
|
-
Hooks.after_hook(
|
24
|
+
hook_step = Hooks.after_hook(@id_generator.new_id, hook.location, &action)
|
25
|
+
@event_bus.hook_test_step_created(hook_step, hook)
|
26
|
+
hook_step
|
22
27
|
end
|
23
28
|
end
|
24
29
|
end
|
@@ -1,26 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'cucumber/hooks'
|
3
4
|
|
4
5
|
module Cucumber
|
5
6
|
class Runtime
|
6
7
|
class BeforeHooks
|
7
|
-
def initialize(hooks, scenario)
|
8
|
+
def initialize(id_generator, hooks, scenario, event_bus)
|
8
9
|
@hooks = hooks
|
9
10
|
@scenario = scenario
|
11
|
+
@id_generator = id_generator
|
12
|
+
@event_bus = event_bus
|
10
13
|
end
|
11
14
|
|
12
15
|
def apply_to(test_case)
|
13
16
|
test_case.with_steps(
|
14
|
-
before_hooks
|
17
|
+
before_hooks + test_case.test_steps
|
15
18
|
)
|
16
19
|
end
|
17
20
|
|
18
21
|
private
|
19
22
|
|
20
|
-
def before_hooks
|
23
|
+
def before_hooks
|
21
24
|
@hooks.map do |hook|
|
22
25
|
action_block = ->(result) { hook.invoke('Before', @scenario.with_result(result)) }
|
23
|
-
Hooks.before_hook(
|
26
|
+
hook_step = Hooks.before_hook(@id_generator.new_id, hook.location, &action_block)
|
27
|
+
@event_bus.hook_test_step_created(hook_step, hook)
|
28
|
+
hook_step
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'forwardable'
|
3
|
-
require 'cucumber/core/
|
4
|
+
require 'cucumber/core/test/doc_string'
|
4
5
|
|
5
6
|
module Cucumber
|
6
7
|
class Runtime
|
@@ -14,19 +15,21 @@ module Cucumber
|
|
14
15
|
attr_reader :support_code
|
15
16
|
|
16
17
|
def initialize(support_code, user_interface)
|
17
|
-
@support_code
|
18
|
+
@support_code = support_code
|
19
|
+
@user_interface = user_interface
|
18
20
|
end
|
19
21
|
|
20
22
|
def_delegators :@user_interface,
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
:embed,
|
24
|
+
:attach,
|
25
|
+
:ask,
|
26
|
+
:puts,
|
27
|
+
:features_paths,
|
28
|
+
:step_match
|
26
29
|
|
27
30
|
def_delegators :@support_code,
|
28
|
-
|
29
|
-
|
31
|
+
:invoke_dynamic_steps,
|
32
|
+
:invoke_dynamic_step
|
30
33
|
end
|
31
34
|
end
|
32
35
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Cucumber
|
3
4
|
class Runtime
|
4
5
|
class StepHooks
|
5
|
-
def initialize(hooks)
|
6
|
+
def initialize(id_generator, hooks)
|
6
7
|
@hooks = hooks
|
8
|
+
@id_generator = id_generator
|
7
9
|
end
|
8
10
|
|
9
11
|
def apply(test_steps)
|
@@ -13,10 +15,11 @@ module Cucumber
|
|
13
15
|
end
|
14
16
|
|
15
17
|
private
|
18
|
+
|
16
19
|
def after_step_hooks(test_step)
|
17
20
|
@hooks.map do |hook|
|
18
21
|
action = ->(*args) { hook.invoke('AfterStep', [args, test_step]) }
|
19
|
-
Hooks.after_step_hook(
|
22
|
+
Hooks.after_step_hook(@id_generator.new_id, test_step, hook.location, &action)
|
20
23
|
end
|
21
24
|
end
|
22
25
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'cucumber/constantize'
|
3
4
|
require 'cucumber/runtime/for_programming_languages'
|
4
5
|
require 'cucumber/runtime/step_hooks'
|
@@ -8,14 +9,10 @@ require 'cucumber/gherkin/steps_parser'
|
|
8
9
|
require 'cucumber/step_match_search'
|
9
10
|
|
10
11
|
module Cucumber
|
11
|
-
|
12
12
|
class Runtime
|
13
|
-
|
14
13
|
class SupportCode
|
15
|
-
|
16
14
|
require 'forwardable'
|
17
15
|
class StepInvoker
|
18
|
-
|
19
16
|
def initialize(support_code)
|
20
17
|
@support_code = support_code
|
21
18
|
end
|
@@ -25,19 +22,15 @@ module Cucumber
|
|
25
22
|
end
|
26
23
|
|
27
24
|
def step(step)
|
28
|
-
location = Core::
|
25
|
+
location = Core::Test::Location.of_caller
|
29
26
|
@support_code.invoke_dynamic_step(step[:text], multiline_arg(step, location))
|
30
27
|
end
|
31
28
|
|
32
29
|
def multiline_arg(step, location)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
MultilineArgument.from(argument[:content], location, argument[:content_type])
|
38
|
-
else
|
39
|
-
MultilineArgument::DataTable.from(argument[:rows].map { |row| row[:cells].map { |cell| cell[:value] } })
|
40
|
-
end
|
30
|
+
if !step[:doc_string].nil?
|
31
|
+
MultilineArgument.from(step[:doc_string][:content], location, step[:doc_string][:content_type])
|
32
|
+
elsif !step[:data_table].nil?
|
33
|
+
MultilineArgument::DataTable.from(step[:data_table][:rows].map { |row| row[:cells].map { |cell| cell[:value] } })
|
41
34
|
else
|
42
35
|
MultilineArgument.from(nil)
|
43
36
|
end
|
@@ -48,7 +41,7 @@ module Cucumber
|
|
48
41
|
|
49
42
|
attr_reader :registry
|
50
43
|
|
51
|
-
def initialize(user_interface, configuration=Configuration.default)
|
44
|
+
def initialize(user_interface, configuration = Configuration.default)
|
52
45
|
@configuration = configuration
|
53
46
|
# TODO: needs a better name, or inlining its methods
|
54
47
|
@runtime_facade = Runtime::ForProgrammingLanguages.new(self, user_interface)
|
@@ -65,8 +58,8 @@ module Cucumber
|
|
65
58
|
# Given I have 8 cukes in my belly
|
66
59
|
# Then I should not be thirsty
|
67
60
|
# })
|
68
|
-
def invoke_dynamic_steps(steps_text,
|
69
|
-
parser = Cucumber::Gherkin::StepsParser.new(StepInvoker.new(self),
|
61
|
+
def invoke_dynamic_steps(steps_text, iso_code, _location)
|
62
|
+
parser = Cucumber::Gherkin::StepsParser.new(StepInvoker.new(self), iso_code)
|
70
63
|
parser.parse(steps_text)
|
71
64
|
end
|
72
65
|
|
@@ -76,7 +69,7 @@ module Cucumber
|
|
76
69
|
# steps which are compiled into test steps before execution.
|
77
70
|
#
|
78
71
|
# These are commonly called nested steps.
|
79
|
-
def invoke_dynamic_step(step_name, multiline_argument, _location=nil)
|
72
|
+
def invoke_dynamic_step(step_name, multiline_argument, _location = nil)
|
80
73
|
matches = step_matches(step_name)
|
81
74
|
raise UndefinedDynamicStep, step_name if matches.empty?
|
82
75
|
matches.first.invoke(multiline_argument)
|
@@ -111,26 +104,28 @@ module Cucumber
|
|
111
104
|
def find_after_step_hooks(test_case)
|
112
105
|
scenario = RunningTestCase.new(test_case)
|
113
106
|
hooks = registry.hooks_for(:after_step, scenario)
|
114
|
-
StepHooks.new hooks
|
107
|
+
StepHooks.new(@configuration.id_generator, hooks)
|
115
108
|
end
|
116
109
|
|
117
110
|
def apply_before_hooks(test_case)
|
111
|
+
return test_case if test_case.test_steps.empty?
|
118
112
|
scenario = RunningTestCase.new(test_case)
|
119
113
|
hooks = registry.hooks_for(:before, scenario)
|
120
|
-
BeforeHooks.new(hooks, scenario).apply_to(test_case)
|
114
|
+
BeforeHooks.new(@configuration.id_generator, hooks, scenario, @configuration.event_bus).apply_to(test_case)
|
121
115
|
end
|
122
116
|
|
123
117
|
def apply_after_hooks(test_case)
|
118
|
+
return test_case if test_case.test_steps.empty?
|
124
119
|
scenario = RunningTestCase.new(test_case)
|
125
120
|
hooks = registry.hooks_for(:after, scenario)
|
126
|
-
AfterHooks.new(hooks, scenario).apply_to(test_case)
|
121
|
+
AfterHooks.new(@configuration.id_generator, hooks, scenario, @configuration.event_bus).apply_to(test_case)
|
127
122
|
end
|
128
123
|
|
129
124
|
def find_around_hooks(test_case)
|
130
125
|
scenario = RunningTestCase.new(test_case)
|
131
126
|
|
132
127
|
registry.hooks_for(:around, scenario).map do |hook|
|
133
|
-
Hooks.around_hook
|
128
|
+
Hooks.around_hook do |run_scenario|
|
134
129
|
hook.invoke('Around', scenario, &run_scenario)
|
135
130
|
end
|
136
131
|
end
|
@@ -150,7 +145,6 @@ module Cucumber
|
|
150
145
|
def log
|
151
146
|
Cucumber.logger
|
152
147
|
end
|
153
|
-
|
154
148
|
end
|
155
149
|
end
|
156
150
|
end
|
@@ -1,20 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'timeout'
|
3
4
|
|
4
5
|
module Cucumber
|
5
6
|
class Runtime
|
6
|
-
|
7
7
|
module UserInterface
|
8
8
|
attr_writer :visitor
|
9
9
|
|
10
|
-
# Output +messages+ alongside the formatted output.
|
11
|
-
# This is an alternative to using Kernel#puts - it will display
|
12
|
-
# nicer, and in all outputs (in case you use several formatters)
|
13
|
-
#
|
14
|
-
def puts(*messages)
|
15
|
-
@visitor.puts(*messages)
|
16
|
-
end
|
17
|
-
|
18
10
|
# Suspends execution and prompts +question+ to the console (STDOUT).
|
19
11
|
# An operator (manual tester) can then enter a line of text and hit
|
20
12
|
# <ENTER>. The entered text is returned, and both +question+ and
|
@@ -33,7 +25,7 @@ module Cucumber
|
|
33
25
|
STDOUT.flush
|
34
26
|
puts(question)
|
35
27
|
|
36
|
-
answer = if
|
28
|
+
answer = if Cucumber::JRUBY
|
37
29
|
jruby_gets(timeout_seconds)
|
38
30
|
else
|
39
31
|
mri_gets(timeout_seconds)
|
@@ -48,20 +40,18 @@ module Cucumber
|
|
48
40
|
# be a path to a file, or if it's an image it may also be a Base64 encoded image.
|
49
41
|
# The embedded data may or may not be ignored, depending on what kind of formatter(s) are active.
|
50
42
|
#
|
51
|
-
def
|
52
|
-
@visitor.
|
43
|
+
def attach(src, media_type)
|
44
|
+
@visitor.attach(src, media_type)
|
53
45
|
end
|
54
46
|
|
55
47
|
private
|
56
48
|
|
57
49
|
def mri_gets(timeout_seconds)
|
58
|
-
|
59
|
-
|
60
|
-
STDIN.gets
|
61
|
-
end
|
62
|
-
rescue Timeout::Error
|
63
|
-
nil
|
50
|
+
Timeout.timeout(timeout_seconds) do
|
51
|
+
STDIN.gets
|
64
52
|
end
|
53
|
+
rescue Timeout::Error
|
54
|
+
nil
|
65
55
|
end
|
66
56
|
|
67
57
|
def jruby_gets(timeout_seconds)
|
@@ -74,6 +64,5 @@ module Cucumber
|
|
74
64
|
answer
|
75
65
|
end
|
76
66
|
end
|
77
|
-
|
78
67
|
end
|
79
68
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Cucumber
|
3
4
|
# TODO: pointless, ancient, kill with fire.
|
4
5
|
# Only used for keeping track of available and invoked step definitions
|
@@ -8,15 +9,16 @@ module Cucumber
|
|
8
9
|
attr_reader :regexp_source, :location
|
9
10
|
|
10
11
|
def initialize(regexp_source, location)
|
11
|
-
@regexp_source
|
12
|
+
@regexp_source = regexp_source
|
13
|
+
@location = location
|
12
14
|
end
|
13
15
|
|
14
|
-
def eql?(
|
15
|
-
regexp_source ==
|
16
|
+
def eql?(other)
|
17
|
+
regexp_source == other.regexp_source && location == other.location
|
16
18
|
end
|
17
19
|
|
18
20
|
def hash
|
19
|
-
regexp_source.hash + 31*location.to_s.hash
|
21
|
+
regexp_source.hash + 31 * location.to_s.hash
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Cucumber
|
3
4
|
class StepDefinitions
|
4
5
|
def initialize(configuration = Configuration.default)
|
@@ -7,8 +8,8 @@ module Cucumber
|
|
7
8
|
@support_code.load_files_from_paths(configuration.autoload_code_paths)
|
8
9
|
end
|
9
10
|
|
10
|
-
def to_json
|
11
|
-
@support_code.step_definitions.map(&:to_hash).to_json
|
11
|
+
def to_json(obj = nil)
|
12
|
+
@support_code.step_definitions.map(&:to_hash).to_json(obj)
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
data/lib/cucumber/step_match.rb
CHANGED
@@ -1,24 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'cucumber/multiline_argument'
|
3
4
|
|
4
5
|
module Cucumber
|
5
|
-
|
6
6
|
# Represents the match found between a Test Step and its activation
|
7
7
|
class StepMatch #:nodoc:
|
8
8
|
attr_reader :step_definition, :step_arguments
|
9
9
|
|
10
10
|
def initialize(step_definition, step_name, step_arguments)
|
11
11
|
raise "step_arguments can't be nil (but it can be an empty array)" if step_arguments.nil?
|
12
|
-
@step_definition
|
12
|
+
@step_definition = step_definition
|
13
|
+
@name_to_match = step_name
|
14
|
+
@step_arguments = step_arguments
|
13
15
|
end
|
14
16
|
|
15
17
|
def args
|
16
|
-
@
|
18
|
+
current_world = @step_definition.registry.current_world
|
19
|
+
@step_arguments.map do |arg|
|
20
|
+
arg.value(current_world)
|
21
|
+
end
|
17
22
|
end
|
18
23
|
|
19
24
|
def activate(test_step)
|
20
25
|
test_step.with_action(@step_definition.location) do
|
21
|
-
invoke(MultilineArgument.from_core(test_step.
|
26
|
+
invoke(MultilineArgument.from_core(test_step.multiline_arg))
|
22
27
|
end
|
23
28
|
end
|
24
29
|
|
@@ -43,7 +48,7 @@ module Cucumber
|
|
43
48
|
#
|
44
49
|
# lambda { |param| "[#{param}]" }
|
45
50
|
#
|
46
|
-
def format_args(format =
|
51
|
+
def format_args(format = ->(a) { a }, &proc)
|
47
52
|
replace_arguments(@name_to_match, @step_arguments, format, &proc)
|
48
53
|
end
|
49
54
|
|
@@ -63,7 +68,7 @@ module Cucumber
|
|
63
68
|
@step_definition.expression.source.to_s.unpack('U*').length
|
64
69
|
end
|
65
70
|
|
66
|
-
def replace_arguments(string, step_arguments, format
|
71
|
+
def replace_arguments(string, step_arguments, format)
|
67
72
|
s = string.dup
|
68
73
|
offset = past_offset = 0
|
69
74
|
step_arguments.each do |step_argument|
|
@@ -71,8 +76,8 @@ module Cucumber
|
|
71
76
|
next if group.value.nil? || group.start < past_offset
|
72
77
|
|
73
78
|
replacement = if block_given?
|
74
|
-
|
75
|
-
elsif Proc
|
79
|
+
yield(group.value)
|
80
|
+
elsif Proc == format.class
|
76
81
|
format.call(group.value)
|
77
82
|
else
|
78
83
|
format % group.value
|
@@ -90,14 +95,15 @@ module Cucumber
|
|
90
95
|
end
|
91
96
|
|
92
97
|
private
|
98
|
+
|
93
99
|
def deep_clone_args
|
94
|
-
Marshal.load(
|
100
|
+
Marshal.load(Marshal.dump(args))
|
95
101
|
end
|
96
102
|
end
|
97
103
|
|
98
104
|
class SkippingStepMatch
|
99
105
|
def activate(test_step)
|
100
|
-
|
106
|
+
test_step.with_action { raise Core::Test::Result::Skipped }
|
101
107
|
end
|
102
108
|
end
|
103
109
|
|
@@ -119,8 +125,7 @@ module Cucumber
|
|
119
125
|
end
|
120
126
|
|
121
127
|
def file_colon_line
|
122
|
-
|
123
|
-
@step.file_colon_line
|
128
|
+
location.to_s
|
124
129
|
end
|
125
130
|
|
126
131
|
def backtrace_line
|
@@ -128,7 +133,7 @@ module Cucumber
|
|
128
133
|
end
|
129
134
|
|
130
135
|
def text_length
|
131
|
-
@step.
|
136
|
+
@step.text.length
|
132
137
|
end
|
133
138
|
|
134
139
|
def step_arguments
|
@@ -137,20 +142,17 @@ module Cucumber
|
|
137
142
|
|
138
143
|
def activate(test_step)
|
139
144
|
# noop
|
140
|
-
|
145
|
+
test_step
|
141
146
|
end
|
142
147
|
end
|
143
148
|
|
144
149
|
class AmbiguousStepMatch
|
145
|
-
|
146
150
|
def initialize(error)
|
147
151
|
@error = error
|
148
152
|
end
|
149
153
|
|
150
154
|
def activate(test_step)
|
151
|
-
|
155
|
+
test_step.with_action { raise @error }
|
152
156
|
end
|
153
|
-
|
154
157
|
end
|
155
|
-
|
156
158
|
end
|