cucumber 3.0.2 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|