cucumber 2.0.0.beta.5 → 2.0.0.rc.1
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/History.md +20 -1
- data/Rakefile +0 -2
- data/cucumber.gemspec +1 -1
- data/features/docs/defining_steps/skip_scenario.feature +31 -2
- data/lib/cucumber.rb +6 -0
- data/lib/cucumber/ast/facade.rb +117 -0
- data/lib/cucumber/cli/configuration.rb +1 -1
- data/lib/cucumber/cli/profile_loader.rb +1 -1
- data/lib/cucumber/file_specs.rb +1 -1
- data/lib/cucumber/filters.rb +9 -0
- data/lib/cucumber/filters/activate_steps.rb +34 -0
- data/lib/cucumber/filters/apply_after_hooks.rb +9 -0
- data/lib/cucumber/filters/apply_after_step_hooks.rb +12 -0
- data/lib/cucumber/filters/apply_around_hooks.rb +12 -0
- data/lib/cucumber/filters/apply_before_hooks.rb +9 -0
- data/lib/cucumber/filters/prepare_world.rb +37 -0
- data/lib/cucumber/filters/quit.rb +5 -1
- data/lib/cucumber/filters/randomizer.rb +5 -1
- data/lib/cucumber/filters/tag_limits.rb +7 -2
- data/lib/cucumber/formatter/ansicolor.rb +0 -8
- data/lib/cucumber/formatter/html.rb +6 -1
- data/lib/cucumber/formatter/legacy_api/adapter.rb +17 -1
- data/lib/cucumber/formatter/legacy_api/ast.rb +6 -1
- data/lib/cucumber/hooks.rb +97 -0
- data/lib/cucumber/platform.rb +2 -3
- data/lib/cucumber/rb_support/rb_hook.rb +2 -2
- data/lib/cucumber/runtime.rb +18 -15
- data/lib/cucumber/runtime/after_hooks.rb +24 -0
- data/lib/cucumber/runtime/before_hooks.rb +23 -0
- data/lib/cucumber/runtime/step_hooks.rb +22 -0
- data/lib/cucumber/runtime/support_code.rb +56 -1
- data/lib/cucumber/step_match.rb +26 -2
- data/spec/cucumber/cli/configuration_spec.rb +16 -1
- data/spec/cucumber/cli/profile_loader_spec.rb +10 -0
- data/spec/cucumber/file_specs_spec.rb +10 -2
- data/spec/cucumber/filters/activate_steps_spec.rb +57 -0
- data/spec/cucumber/formatter/debug_spec.rb +0 -14
- data/spec/cucumber/formatter/html_spec.rb +29 -0
- data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +210 -110
- data/spec/cucumber/formatter/pretty_spec.rb +0 -2
- data/spec/cucumber/formatter/rerun_spec.rb +17 -16
- data/spec/cucumber/formatter/spec_helper.rb +11 -6
- data/spec/cucumber/hooks_spec.rb +30 -0
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +11 -4
- metadata +22 -16
- data/gem_tasks/yard.rake +0 -43
- data/gem_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
- data/gem_tasks/yard/default/layout/html/footer.erb +0 -5
- data/gem_tasks/yard/default/layout/html/index.erb +0 -1
- data/gem_tasks/yard/default/layout/html/layout.erb +0 -25
- data/gem_tasks/yard/default/layout/html/logo.erb +0 -1
- data/gem_tasks/yard/default/layout/html/setup.rb +0 -4
- data/lib/cucumber/mappings.rb +0 -238
- data/spec/cucumber/mappings_spec.rb +0 -180
@@ -1,14 +1,6 @@
|
|
1
1
|
require 'cucumber/platform'
|
2
2
|
require 'cucumber/term/ansicolor'
|
3
3
|
|
4
|
-
if Cucumber::IRONRUBY
|
5
|
-
begin
|
6
|
-
require 'iron-term-ansicolor'
|
7
|
-
rescue LoadError
|
8
|
-
STDERR.puts %{*** WARNING: You must "igem install iron-term-ansicolor" to get coloured ouput in on IronRuby}
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
4
|
if Cucumber::WINDOWS_MRI
|
13
5
|
unless ENV['ANSICON']
|
14
6
|
STDERR.puts %{*** WARNING: You must use ANSICON 1.31 or higher (https://github.com/adoxa/ansicon/) to get coloured output on Windows}
|
@@ -2,6 +2,7 @@ require 'erb'
|
|
2
2
|
require 'builder'
|
3
3
|
require 'cucumber/formatter/duration'
|
4
4
|
require 'cucumber/formatter/io'
|
5
|
+
require 'pathname'
|
5
6
|
|
6
7
|
module Cucumber
|
7
8
|
module Formatter
|
@@ -50,6 +51,10 @@ module Cucumber
|
|
50
51
|
def embed_image(src, label)
|
51
52
|
id = "img_#{@img_id}"
|
52
53
|
@img_id += 1
|
54
|
+
if @io.respond_to?(:path) and File.file?(src)
|
55
|
+
out_dir = Pathname.new(File.dirname(File.absolute_path(@io.path)))
|
56
|
+
src = Pathname.new(File.absolute_path(src)).relative_path_from(out_dir)
|
57
|
+
end
|
53
58
|
@builder.span(:class => 'embed') do |pre|
|
54
59
|
pre << %{<a href="" onclick="img=document.getElementById('#{id}'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false">#{label}</a><br>
|
55
60
|
<img id="#{id}" style="display: none" src="#{src}"/>}
|
@@ -562,7 +567,7 @@ module Cucumber
|
|
562
567
|
end
|
563
568
|
|
564
569
|
def backtrace_line(line)
|
565
|
-
line.gsub(
|
570
|
+
line.gsub(/^([^:]*\.(?:rb|feature|haml)):(\d*).*$/) do
|
566
571
|
if ENV['TM_PROJECT_DIRECTORY']
|
567
572
|
"<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
|
568
573
|
else
|
@@ -238,6 +238,7 @@ module Cucumber
|
|
238
238
|
end
|
239
239
|
|
240
240
|
def after_step_hook(hook, result)
|
241
|
+
p current_test_step_source if current_test_step_source.step.nil?
|
241
242
|
line = StepBacktraceLine.new(current_test_step_source.step)
|
242
243
|
@child.after_step_hook Ast::HookResult.new(LegacyResultBuilder.new(result).
|
243
244
|
append_to_exception_backtrace(line), @delayed_messages, @delayed_embeddings)
|
@@ -398,7 +399,11 @@ module Cucumber
|
|
398
399
|
|
399
400
|
# Basic printer used by default
|
400
401
|
class AfterHookPrinter
|
401
|
-
|
402
|
+
attr_reader :formatter
|
403
|
+
|
404
|
+
def initialize(formatter)
|
405
|
+
@formatter = formatter
|
406
|
+
end
|
402
407
|
|
403
408
|
include PrintsAfterHooks
|
404
409
|
|
@@ -409,6 +414,12 @@ module Cucumber
|
|
409
414
|
|
410
415
|
BackgroundPrinter = Struct.new(:formatter, :node, :before_hook_results) do
|
411
416
|
|
417
|
+
def after_test_case(*)
|
418
|
+
end
|
419
|
+
|
420
|
+
def after_hook(*)
|
421
|
+
end
|
422
|
+
|
412
423
|
def before
|
413
424
|
formatter.before_background node
|
414
425
|
formatter.background_name node.keyword, node.legacy_conflated_name_and_description, node.location.to_s, indent.of(node)
|
@@ -965,6 +976,11 @@ module Cucumber
|
|
965
976
|
end
|
966
977
|
|
967
978
|
class StepBacktraceLine < Struct.new(:step)
|
979
|
+
def initialize(step)
|
980
|
+
raise ArgumentError if step.nil?
|
981
|
+
super
|
982
|
+
end
|
983
|
+
|
968
984
|
def to_s
|
969
985
|
step.backtrace_line
|
970
986
|
end
|
@@ -118,7 +118,12 @@ module Cucumber
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def step_result_attributes
|
121
|
-
|
121
|
+
legacy_multiline_arg = if multiline_arg.kind_of?(Core::Ast::EmptyMultilineArgument)
|
122
|
+
nil
|
123
|
+
else
|
124
|
+
step.multiline_arg
|
125
|
+
end
|
126
|
+
[keyword, step_match, legacy_multiline_arg, status, exception, source_indent, background, file_colon_line]
|
122
127
|
end
|
123
128
|
|
124
129
|
def failed?
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'cucumber/core/test/around_hook'
|
2
|
+
|
3
|
+
module Cucumber
|
4
|
+
|
5
|
+
# Hooks quack enough like `Cucumber::Core::Ast` source nodes that we can use them as
|
6
|
+
# source for test steps
|
7
|
+
module Hooks
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def before_hook(source, &block)
|
11
|
+
build_hook_step(source, block, BeforeHook, Core::Test::UnskippableAction)
|
12
|
+
end
|
13
|
+
|
14
|
+
def after_hook(source, &block)
|
15
|
+
build_hook_step(source, block, AfterHook, Core::Test::UnskippableAction)
|
16
|
+
end
|
17
|
+
|
18
|
+
def after_step_hook(source, &block)
|
19
|
+
raise ArgumentError unless source.last.kind_of?(Core::Ast::Step)
|
20
|
+
build_hook_step(source, block, AfterStepHook, Core::Test::Action)
|
21
|
+
end
|
22
|
+
|
23
|
+
def around_hook(source, &block)
|
24
|
+
Core::Test::AroundHook.new(&block)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def build_hook_step(source, block, hook_type, action_type)
|
30
|
+
action = action_type.new(&block)
|
31
|
+
hook = hook_type.new(action.location)
|
32
|
+
Core::Test::Step.new(source + [hook], action)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class AfterHook
|
37
|
+
attr_reader :location
|
38
|
+
|
39
|
+
def initialize(location)
|
40
|
+
@location = location
|
41
|
+
end
|
42
|
+
|
43
|
+
def name
|
44
|
+
"After hook"
|
45
|
+
end
|
46
|
+
|
47
|
+
def match_locations?(queried_locations)
|
48
|
+
queried_locations.any? { |other_location| other_location.match?(location) }
|
49
|
+
end
|
50
|
+
|
51
|
+
def describe_to(visitor, *args)
|
52
|
+
visitor.after_hook(self, *args)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class BeforeHook
|
57
|
+
attr_reader :location
|
58
|
+
|
59
|
+
def initialize(location)
|
60
|
+
@location = location
|
61
|
+
end
|
62
|
+
|
63
|
+
def name
|
64
|
+
"Before hook"
|
65
|
+
end
|
66
|
+
|
67
|
+
def match_locations?(queried_locations)
|
68
|
+
queried_locations.any? { |other_location| other_location.match?(location) }
|
69
|
+
end
|
70
|
+
|
71
|
+
def describe_to(visitor, *args)
|
72
|
+
visitor.before_hook(self, *args)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class AfterStepHook
|
77
|
+
attr_reader :location
|
78
|
+
|
79
|
+
def initialize(location)
|
80
|
+
@location = location
|
81
|
+
end
|
82
|
+
|
83
|
+
def name
|
84
|
+
"AfterStep hook"
|
85
|
+
end
|
86
|
+
|
87
|
+
def match_locations?(queried_locations)
|
88
|
+
queried_locations.any? { |other_location| other_location.match?(location) }
|
89
|
+
end
|
90
|
+
|
91
|
+
def describe_to(visitor, *args)
|
92
|
+
visitor.after_step_hook(self, *args)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
data/lib/cucumber/platform.rb
CHANGED
@@ -4,14 +4,13 @@ require 'rbconfig'
|
|
4
4
|
|
5
5
|
module Cucumber
|
6
6
|
unless defined?(Cucumber::VERSION)
|
7
|
-
VERSION = '2.0.0.
|
7
|
+
VERSION = '2.0.0.rc.1'
|
8
8
|
BINARY = File.expand_path(File.dirname(__FILE__) + '/../../bin/cucumber')
|
9
9
|
LIBDIR = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
10
10
|
JRUBY = defined?(JRUBY_VERSION)
|
11
|
-
IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == "ironruby"
|
12
11
|
WINDOWS = RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
13
12
|
OS_X = RbConfig::CONFIG['host_os'] =~ /darwin/
|
14
|
-
WINDOWS_MRI = WINDOWS && !JRUBY
|
13
|
+
WINDOWS_MRI = WINDOWS && !JRUBY
|
15
14
|
RAILS = defined?(Rails)
|
16
15
|
RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
17
16
|
RUBY_2_1 = RUBY_VERSION =~ /^2\.1/
|
@@ -10,8 +10,8 @@ module Cucumber
|
|
10
10
|
@proc = proc
|
11
11
|
end
|
12
12
|
|
13
|
-
def invoke(
|
14
|
-
@rb_language.current_world.cucumber_instance_exec(false,
|
13
|
+
def invoke(pseudo_method, arguments, &block)
|
14
|
+
@rb_language.current_world.cucumber_instance_exec(false, pseudo_method, *[arguments, block].compact, &@proc)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/lib/cucumber/runtime.rb
CHANGED
@@ -9,9 +9,7 @@ require 'cucumber/load_path'
|
|
9
9
|
require 'cucumber/language_support/language_methods'
|
10
10
|
require 'cucumber/formatter/duration'
|
11
11
|
require 'cucumber/file_specs'
|
12
|
-
require 'cucumber/filters
|
13
|
-
require 'cucumber/filters/randomizer'
|
14
|
-
require 'cucumber/filters/tag_limits'
|
12
|
+
require 'cucumber/filters'
|
15
13
|
require 'cucumber/formatter/fanout'
|
16
14
|
|
17
15
|
module Cucumber
|
@@ -68,7 +66,8 @@ module Cucumber
|
|
68
66
|
fire_after_configuration_hook
|
69
67
|
self.visitor = report
|
70
68
|
|
71
|
-
|
69
|
+
receiver = Test::Runner.new(report)
|
70
|
+
compile features, receiver, filters
|
72
71
|
end
|
73
72
|
|
74
73
|
def features_paths
|
@@ -173,11 +172,6 @@ module Cucumber
|
|
173
172
|
end
|
174
173
|
end
|
175
174
|
|
176
|
-
require 'cucumber/mappings'
|
177
|
-
def mappings
|
178
|
-
@mappings = Mappings.for(self)
|
179
|
-
end
|
180
|
-
|
181
175
|
require 'cucumber/formatter/legacy_api/adapter'
|
182
176
|
require 'cucumber/formatter/legacy_api/runtime_facade'
|
183
177
|
require 'cucumber/formatter/legacy_api/results'
|
@@ -218,12 +212,21 @@ module Cucumber
|
|
218
212
|
name_regexps = @configuration.name_regexps
|
219
213
|
tag_limits = @configuration.tag_limits
|
220
214
|
[].tap do |filters|
|
221
|
-
filters <<
|
222
|
-
filters <<
|
223
|
-
filters <<
|
224
|
-
filters <<
|
225
|
-
filters <<
|
226
|
-
filters <<
|
215
|
+
filters << Filters::Randomizer.new(@configuration.seed) if @configuration.randomize?
|
216
|
+
filters << Filters::TagLimits.new(tag_limits) if tag_limits.any?
|
217
|
+
filters << Cucumber::Core::Test::TagFilter.new(tag_expressions)
|
218
|
+
filters << Cucumber::Core::Test::NameFilter.new(name_regexps)
|
219
|
+
filters << Cucumber::Core::Test::LocationsFilter.new(filespecs.locations)
|
220
|
+
filters << Filters::Quit.new
|
221
|
+
filters << Filters::ActivateSteps.new(@support_code)
|
222
|
+
unless configuration.dry_run?
|
223
|
+
filters << Filters::ApplyAfterStepHooks.new(@support_code)
|
224
|
+
filters << Filters::ApplyBeforeHooks.new(@support_code)
|
225
|
+
filters << Filters::ApplyAfterHooks.new(@support_code)
|
226
|
+
filters << Filters::ApplyAroundHooks.new(@support_code)
|
227
|
+
# need to do this last so it becomes the first test step
|
228
|
+
filters << Filters::PrepareWorld.new(self)
|
229
|
+
end
|
227
230
|
end
|
228
231
|
end
|
229
232
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Cucumber
|
2
|
+
class Runtime
|
3
|
+
class AfterHooks
|
4
|
+
def initialize(action_blocks)
|
5
|
+
@action_blocks = action_blocks
|
6
|
+
end
|
7
|
+
|
8
|
+
def apply_to(test_case)
|
9
|
+
test_case.with_steps(
|
10
|
+
test_case.test_steps + after_hooks(test_case.source)
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def after_hooks(source)
|
17
|
+
@action_blocks.map do |action_block|
|
18
|
+
Hooks.after_hook(source, &action_block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Cucumber
|
2
|
+
class Runtime
|
3
|
+
class BeforeHooks
|
4
|
+
def initialize(action_blocks)
|
5
|
+
@action_blocks = action_blocks
|
6
|
+
end
|
7
|
+
|
8
|
+
def apply_to(test_case)
|
9
|
+
test_case.with_steps(
|
10
|
+
before_hooks(test_case.source) + test_case.test_steps
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def before_hooks(source)
|
17
|
+
@action_blocks.map do |action_block|
|
18
|
+
Hooks.before_hook(source, &action_block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Cucumber
|
2
|
+
class Runtime
|
3
|
+
class StepHooks
|
4
|
+
def initialize(after)
|
5
|
+
@after = after
|
6
|
+
end
|
7
|
+
|
8
|
+
def apply(test_steps)
|
9
|
+
test_steps.flat_map do |test_step|
|
10
|
+
[test_step] + after_step_hooks(test_step)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def after_step_hooks(test_step)
|
16
|
+
@after.map do |action_block|
|
17
|
+
Hooks.after_step_hook(test_step.source, &action_block)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'cucumber/constantize'
|
2
2
|
require 'cucumber/runtime/for_programming_languages'
|
3
|
+
require 'cucumber/runtime/step_hooks'
|
4
|
+
require 'cucumber/runtime/before_hooks'
|
5
|
+
require 'cucumber/runtime/after_hooks'
|
3
6
|
|
4
7
|
module Cucumber
|
5
8
|
|
@@ -7,7 +10,6 @@ module Cucumber
|
|
7
10
|
|
8
11
|
class SupportCode
|
9
12
|
|
10
|
-
# TODO: figure out a way to move this to the core. We'd need to have access to the mappings to pass those in.
|
11
13
|
require 'forwardable'
|
12
14
|
class StepInvoker
|
13
15
|
include Gherkin::Rubify
|
@@ -121,6 +123,59 @@ module Cucumber
|
|
121
123
|
end.flatten
|
122
124
|
end
|
123
125
|
|
126
|
+
def find_match(test_step)
|
127
|
+
begin
|
128
|
+
match = step_match(test_step.name)
|
129
|
+
rescue Cucumber::Undefined
|
130
|
+
return NoStepMatch.new(test_step.source.last, test_step.name)
|
131
|
+
end
|
132
|
+
if @configuration.dry_run?
|
133
|
+
return SkippingStepMatch.new
|
134
|
+
end
|
135
|
+
match
|
136
|
+
end
|
137
|
+
|
138
|
+
def find_after_step_hooks(test_case)
|
139
|
+
ruby = load_programming_language('rb')
|
140
|
+
scenario = Ast::Facade.new(test_case).build_scenario
|
141
|
+
|
142
|
+
action_blocks = ruby.hooks_for(:after_step, scenario).map do |hook|
|
143
|
+
->(*args) { hook.invoke('AfterStep', args) }
|
144
|
+
end
|
145
|
+
StepHooks.new action_blocks
|
146
|
+
end
|
147
|
+
|
148
|
+
def apply_before_hooks(test_case)
|
149
|
+
ruby = load_programming_language('rb')
|
150
|
+
scenario = Ast::Facade.new(test_case).build_scenario
|
151
|
+
|
152
|
+
action_blocks = ruby.hooks_for(:before, scenario).map do |hook|
|
153
|
+
->(result) { hook.invoke('Before', scenario.with_result(result)) }
|
154
|
+
end
|
155
|
+
BeforeHooks.new(action_blocks).apply_to(test_case)
|
156
|
+
end
|
157
|
+
|
158
|
+
def apply_after_hooks(test_case)
|
159
|
+
ruby = load_programming_language('rb')
|
160
|
+
scenario = Ast::Facade.new(test_case).build_scenario
|
161
|
+
|
162
|
+
action_blocks = ruby.hooks_for(:after, scenario).map do |hook|
|
163
|
+
->(result) { hook.invoke('After', scenario.with_result(result)) }
|
164
|
+
end
|
165
|
+
AfterHooks.new(action_blocks).apply_to(test_case)
|
166
|
+
end
|
167
|
+
|
168
|
+
def find_around_hooks(test_case)
|
169
|
+
ruby = load_programming_language('rb')
|
170
|
+
scenario = Ast::Facade.new(test_case).build_scenario
|
171
|
+
|
172
|
+
ruby.hooks_for(:around, scenario).map do |hook|
|
173
|
+
Hooks.around_hook(test_case.source) do |run_scenario|
|
174
|
+
hook.invoke('Around', scenario, &run_scenario)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
124
179
|
def step_match(step_name, name_to_report=nil) #:nodoc:
|
125
180
|
@match_cache ||= {}
|
126
181
|
|
data/lib/cucumber/step_match.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'cucumber/multiline_argument'
|
2
|
+
|
1
3
|
module Cucumber
|
2
4
|
class StepMatch #:nodoc:
|
3
5
|
attr_reader :step_definition, :step_arguments
|
@@ -12,15 +14,21 @@ module Cucumber
|
|
12
14
|
end
|
13
15
|
|
14
16
|
def args
|
15
|
-
@step_arguments.map{|g| g.val
|
17
|
+
@step_arguments.map{|g| g.val }
|
16
18
|
end
|
17
19
|
|
18
20
|
def name
|
19
21
|
@name_to_report
|
20
22
|
end
|
21
23
|
|
24
|
+
def activate(test_step)
|
25
|
+
test_step.with_action do
|
26
|
+
invoke(MultilineArgument.from_core(test_step.source.last.multiline_arg))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
22
30
|
def invoke(multiline_arg)
|
23
|
-
all_args =
|
31
|
+
all_args = deep_clone_args
|
24
32
|
multiline_arg.append_to(all_args)
|
25
33
|
@step_definition.invoke(all_args)
|
26
34
|
end
|
@@ -80,6 +88,17 @@ module Cucumber
|
|
80
88
|
def inspect #:nodoc:
|
81
89
|
sprintf("#<%s:0x%x>", self.class, self.object_id)
|
82
90
|
end
|
91
|
+
|
92
|
+
private
|
93
|
+
def deep_clone_args
|
94
|
+
Marshal.load( Marshal.dump( args ) )
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class SkippingStepMatch
|
99
|
+
def activate(test_step)
|
100
|
+
return test_step.with_action { raise Core::Test::Result::Skipped.new }
|
101
|
+
end
|
83
102
|
end
|
84
103
|
|
85
104
|
class NoStepMatch #:nodoc:
|
@@ -110,5 +129,10 @@ module Cucumber
|
|
110
129
|
def step_arguments
|
111
130
|
[]
|
112
131
|
end
|
132
|
+
|
133
|
+
def activate(test_step)
|
134
|
+
# noop
|
135
|
+
return test_step
|
136
|
+
end
|
113
137
|
end
|
114
138
|
end
|