cucumber 0.3.100 → 0.3.101
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.
- data/History.txt +12 -0
- data/Manifest.txt +3 -0
- data/examples/self_test/features/step_definitions/sample_steps.rb +12 -0
- data/examples/self_test/features/support/env.rb +6 -0
- data/examples/self_test/features/transform_sample.feature +10 -0
- data/features/cucumber_cli.feature +17 -2
- data/features/html_formatter/a.html +8 -8
- data/features/step_definitions/cucumber_steps.rb +4 -4
- data/features/transform.feature +24 -0
- data/features/usage.feature +6 -0
- data/lib/cucumber/ast/tags.rb +3 -1
- data/lib/cucumber/cli/options.rb +5 -1
- data/lib/cucumber/core_ext/instance_exec.rb +1 -1
- data/lib/cucumber/formatter/html.rb +1 -1
- data/lib/cucumber/formatter/pdf.rb +217 -0
- data/lib/cucumber/rb_support/rb_dsl.rb +10 -1
- data/lib/cucumber/step_mother.rb +29 -2
- data/lib/cucumber/version.rb +1 -1
- data/rails_generators/cucumber/templates/webrat_steps.rb +50 -8
- data/spec/cucumber/step_mother_spec.rb +95 -0
- metadata +5 -2
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== In Git
|
2
|
+
|
3
|
+
Step Argument Transforms
|
4
|
+
|
5
|
+
=== New Features
|
6
|
+
* New pdf formatter (#425 Mads Buus)
|
7
|
+
* Step Argument Transforms: These let you use the Transform method to register regular expressions
|
8
|
+
to catch and transform/coerce arguments before they are yielded to step definitions:
|
9
|
+
http://wiki.github.com/aslakhellesoy/cucumber/step-argument-transforms (Larry Diehl & Dave Astels)
|
10
|
+
* Adding webrat steps for asserting content does or does not exist within a particular element
|
11
|
+
(using webrat's within method) (Kieran Pilkington)
|
12
|
+
|
1
13
|
== 0.3.100 2009-09-09
|
2
14
|
|
3
15
|
The JavaZone release!
|
data/Manifest.txt
CHANGED
@@ -211,6 +211,7 @@ examples/self_test/features/step_definitions/sample_steps.rb
|
|
211
211
|
examples/self_test/features/support/env.rb
|
212
212
|
examples/self_test/features/tags_sample.feature
|
213
213
|
examples/self_test/features/tons_of_cukes.feature
|
214
|
+
examples/self_test/features/transform_sample.feature
|
214
215
|
examples/self_test/features/undefined_multiline_args.feature
|
215
216
|
examples/self_test/list-of-features.txt
|
216
217
|
examples/sinatra/README.textile
|
@@ -289,6 +290,7 @@ features/step_definitions/extra_steps.rb
|
|
289
290
|
features/steps_formatter.feature
|
290
291
|
features/support/env.rb
|
291
292
|
features/table_diffing.feature
|
293
|
+
features/transform.feature
|
292
294
|
features/unicode_table.feature
|
293
295
|
features/usage.feature
|
294
296
|
features/work_in_progress.feature
|
@@ -349,6 +351,7 @@ lib/cucumber/formatter/duration.rb
|
|
349
351
|
lib/cucumber/formatter/html.rb
|
350
352
|
lib/cucumber/formatter/junit.rb
|
351
353
|
lib/cucumber/formatter/ordered_xml_markup.rb
|
354
|
+
lib/cucumber/formatter/pdf.rb
|
352
355
|
lib/cucumber/formatter/pretty.rb
|
353
356
|
lib/cucumber/formatter/profile.rb
|
354
357
|
lib/cucumber/formatter/progress.rb
|
@@ -79,3 +79,15 @@ After('@after_file') do
|
|
79
79
|
FileUtils.mkdir_p(File.dirname(after_file))
|
80
80
|
FileUtils.touch(after_file)
|
81
81
|
end
|
82
|
+
|
83
|
+
Then /^I should transform ('\d+' to an Integer)$/ do |integer|
|
84
|
+
integer.should be_kind_of(Integer)
|
85
|
+
end
|
86
|
+
|
87
|
+
Then /^I should transform ('\w+' to a Symbol)$/ do |symbol|
|
88
|
+
symbol.should be_kind_of(Symbol)
|
89
|
+
end
|
90
|
+
|
91
|
+
Then /^I should not transform ('\d+') to an Integer$/ do |string|
|
92
|
+
string.should be_kind_of(String)
|
93
|
+
end
|
@@ -16,3 +16,9 @@ end
|
|
16
16
|
After('@background_tagged_before_on_outline') do
|
17
17
|
@cukes.should == '888'
|
18
18
|
end
|
19
|
+
|
20
|
+
Transform /^'\d+' to an Integer$/ do |step_arg|
|
21
|
+
/'(\d+)' to an Integer/.match(step_arg)[0].to_i
|
22
|
+
end
|
23
|
+
|
24
|
+
Transform(/^('\w+') to a Symbol$/) {|str| str.to_sym }
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Feature: Step argument transformations
|
2
|
+
|
3
|
+
Scenario: transform with matches
|
4
|
+
Then I should transform '10' to an Integer
|
5
|
+
|
6
|
+
Scenario: transform with matches that capture
|
7
|
+
Then I should transform 'abc' to a Symbol
|
8
|
+
|
9
|
+
Scenario: transform without matches
|
10
|
+
Then I should not transform '10' to an Integer
|
@@ -351,6 +351,17 @@ Feature: Cucumber command line
|
|
351
351
|
Scenario: Skipped
|
352
352
|
Given missing
|
353
353
|
|
354
|
+
Feature: Step argument transformations
|
355
|
+
|
356
|
+
Scenario: transform with matches
|
357
|
+
Then I should transform '10' to an Integer
|
358
|
+
|
359
|
+
Scenario: transform with matches that capture
|
360
|
+
Then I should transform 'abc' to a Symbol
|
361
|
+
|
362
|
+
Scenario: transform without matches
|
363
|
+
Then I should not transform '10' to an Integer
|
364
|
+
|
354
365
|
Feature: undefined multiline args
|
355
366
|
|
356
367
|
Scenario: pystring
|
@@ -364,8 +375,8 @@ Feature: Cucumber command line
|
|
364
375
|
| table |
|
365
376
|
| example |
|
366
377
|
|
367
|
-
|
368
|
-
|
378
|
+
29 scenarios (20 skipped, 8 undefined, 1 passed)
|
379
|
+
45 steps (33 skipped, 12 undefined)
|
369
380
|
|
370
381
|
"""
|
371
382
|
|
@@ -620,6 +631,10 @@ Feature: Cucumber command line
|
|
620
631
|
|
621
632
|
"""
|
622
633
|
|
634
|
+
Scenario: Generate PDF with pdf formatter
|
635
|
+
When I run cucumber --format pdf --out tmp/sample.pdf --dry-run features/sample.feature
|
636
|
+
Then "examples/self_test/tmp/sample.pdf" should match "Pages 2"
|
637
|
+
|
623
638
|
Scenario: Run feature elements which match a name using -n
|
624
639
|
When I run cucumber -n Pisang -q features/
|
625
640
|
Then it should pass with
|
@@ -142,12 +142,12 @@ features/background/failing_background_after_success.feature:5:in `And '10' glob
|
|
142
142
|
features/background/scenario_outline_failing_background.feature:4:in `Given failing without a table'</pre></li></ol></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">failing background</span></h3><ol><li class="step skipped" id="features_background_scenario_outline_failing_background_feature_7"><div><span class="keyword">Then</span> <span class="step val">I should have '<count>' cukes</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_9"><th class="val skipped_param" id="row_9_0">count</th></tr><tr id="row_10"><td class="val skipped" id="row_10_0">10</td></tr><tr><td class="failed" colspan="1"><pre>FAIL (RuntimeError)
|
143
143
|
./features/step_definitions/sample_steps.rb:2:in `flunker'
|
144
144
|
./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
|
145
|
-
features/background/scenario_outline_failing_background.feature:4:in `Given failing without a table'</pre></td></tr></table></div></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">another failing background</span></h3><ol><li class="step skipped" id="features_background_scenario_outline_failing_background_feature_13"><div><span class="keyword">Then</span> <span class="step val">I should have '<count>' cukes</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_15"><th class="val skipped_param" id="row_15_0">count</th></tr><tr id="row_16"><td class="val skipped" id="row_16_0">10</td></tr></table></div></div></div><div class="feature"><h2><span class="val">Feature: Passing background with scenario outlines sample</span></h2><p class="narrative"></p><div class="background"><h3><span class="keyword">Background:</span> <span class="val"></span></h3><ol><li class="step passed" id="features_background_scenario_outline_passing_background_feature_4"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">10</span>' cukes</span></div></li></ol></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">passing background</span></h3><ol><li class="step skipped" id="features_background_scenario_outline_passing_background_feature_7"><div><span class="keyword">Then</span> <span class="step val">I should have '<count>' cukes</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_9"><th class="val skipped_param" id="row_9_0">count</th></tr><tr id="row_10"><td class="val passed" id="row_10_0">10</td></tr></table></div></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">another passing background</span></h3><ol><li class="step skipped" id="features_background_scenario_outline_passing_background_feature_13"><div><span class="keyword">Then</span> <span class="step val">I should have '<count>' cukes</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_15"><th class="val skipped_param" id="row_15_0">count</th></tr><tr id="row_16"><td class="val passed" id="row_16_0">10</td></tr></table></div></div></div><div class="feature"><h2><span class="val">Feature: Calling undefined step</span></h2><p class="narrative"></p><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">Call directly</span></h3><ol><li class="step undefined" id="features_call_undefined_step_from_step_def_feature_4"><div><span class="keyword">Given</span> <span class="step val">a step definition that calls an undefined step</span></div><pre class="undefined">Undefined step:
|
145
|
+
features/background/scenario_outline_failing_background.feature:4:in `Given failing without a table'</pre></td></tr></table></div></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">another failing background</span></h3><ol><li class="step skipped" id="features_background_scenario_outline_failing_background_feature_13"><div><span class="keyword">Then</span> <span class="step val">I should have '<count>' cukes</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_15"><th class="val skipped_param" id="row_15_0">count</th></tr><tr id="row_16"><td class="val skipped" id="row_16_0">10</td></tr></table></div></div></div><div class="feature"><h2><span class="val">Feature: Passing background with scenario outlines sample</span></h2><p class="narrative"></p><div class="background"><h3><span class="keyword">Background:</span> <span class="val"></span></h3><ol><li class="step passed" id="features_background_scenario_outline_passing_background_feature_4"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">10</span>' cukes</span></div></li></ol></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">passing background</span></h3><ol><li class="step skipped" id="features_background_scenario_outline_passing_background_feature_7"><div><span class="keyword">Then</span> <span class="step val">I should have '<count>' cukes</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_9"><th class="val skipped_param" id="row_9_0">count</th></tr><tr id="row_10"><td class="val passed" id="row_10_0">10</td></tr></table></div></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">another passing background</span></h3><ol><li class="step skipped" id="features_background_scenario_outline_passing_background_feature_13"><div><span class="keyword">Then</span> <span class="step val">I should have '<count>' cukes</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_15"><th class="val skipped_param" id="row_15_0">count</th></tr><tr id="row_16"><td class="val passed" id="row_16_0">10</td></tr></table></div></div></div><div class="feature"><h2><span class="val">Feature: Calling undefined step</span></h2><p class="narrative"></p><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">Call directly</span></h3><ol><li class="step undefined" id="features_call_undefined_step_from_step_def_feature_4"><div><span class="keyword">Given</span> <span class="step val">a step definition that calls an undefined step</span></div><pre class="undefined">Undefined step: &quot;this does not exist&quot; (Cucumber::Undefined)
|
146
146
|
./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
|
147
|
-
features/call_undefined_step_from_step_def.feature:4:in `Given a step definition that calls an undefined step'</pre></li></ol></div><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">Call via another</span></h3><ol><li class="step undefined" id="features_call_undefined_step_from_step_def_feature_7"><div><span class="keyword">Given</span> <span class="step val">call step "<span class="param">a step definition that calls an undefined step</span>"</span></div><pre class="undefined">Undefined step:
|
147
|
+
features/call_undefined_step_from_step_def.feature:4:in `Given a step definition that calls an undefined step'</pre></li></ol></div><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">Call via another</span></h3><ol><li class="step undefined" id="features_call_undefined_step_from_step_def_feature_7"><div><span class="keyword">Given</span> <span class="step val">call step "<span class="param">a step definition that calls an undefined step</span>"</span></div><pre class="undefined">Undefined step: &quot;this does not exist&quot; (Cucumber::Undefined)
|
148
148
|
./features/step_definitions/sample_steps.rb:20:in `/^a step definition that calls an undefined step$/'
|
149
|
-
features/call_undefined_step_from_step_def.feature:7:in `Given call step
|
150
|
-
got:
|
149
|
+
features/call_undefined_step_from_step_def.feature:7:in `Given call step &quot;a step definition that calls an undefined step&quot;'</pre></li></ol></div></div><div class="feature"><h2><span class="val">Feature: Failing expectation</span></h2><p class="narrative"></p><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">Failing expectation</span></h3><ol><li class="step failed" id="features_failing_expectation_feature_4"><div><span class="keyword">Given</span> <span class="step val">failing expectation</span></div><pre class="failed">expected: &quot;that&quot;,
|
150
|
+
got: &quot;this&quot; (using ==)
|
151
151
|
|
152
152
|
Diff:
|
153
153
|
@@ -1,2 +1,2 @@
|
@@ -166,7 +166,7 @@ which goes on and on and on for three lines
|
|
166
166
|
yawn</span></h4><table><tr id="row_26"><th class="val skipped_param" id="row_26_0">state</th></tr><tr id="row_27"><td class="val passed" id="row_27_0">passing</td></tr></table></div></div></div><div class="feature"><h2><span class="val">Feature: Outline Sample</span></h2><p class="narrative"></p><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">I have no steps</span></h3><ol></ol></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">Test state</span></h3><ol><li class="step skipped" id="features_outline_sample_feature_6"><div><span class="keyword">Given</span> <span class="step val"><state> without a table</span></div></li><li class="step skipped" id="features_outline_sample_feature_7"><div><span class="keyword">Given</span> <span class="step val"><other_state> without a table</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val">Rainbow colours</span></h4><table><tr id="row_9"><th class="val skipped_param" id="row_9_0">state</th><th class="val skipped_param" id="row_9_1">other_state</th></tr><tr id="row_10"><td class="val undefined" id="row_10_0">missing</td><td class="val skipped" id="row_10_1">passing</td></tr><tr id="row_11"><td class="val passed" id="row_11_0">passing</td><td class="val passed" id="row_11_1">passing</td></tr><tr id="row_12"><td class="val failed" id="row_12_0">failing</td><td class="val skipped" id="row_12_1">passing</td></tr><tr><td class="failed" colspan="2"><pre>FAIL (RuntimeError)
|
167
167
|
./features/step_definitions/sample_steps.rb:2:in `flunker'
|
168
168
|
./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
|
169
|
-
features/outline_sample.feature:6:in `Given
|
169
|
+
features/outline_sample.feature:6:in `Given <state> without a table'</pre></td></tr></table></div><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val">Only passing</span></h4><table><tr id="row_14"><th class="val skipped_param" id="row_14_0">state</th><th class="val skipped_param" id="row_14_1">other_state</th></tr><tr id="row_15"><td class="val passed" id="row_15_0">passing</td><td class="val passed" id="row_15_1">passing</td></tr></table></div></div></div><div class="feature"><pre class="comment"># Feature comment<br/></pre><span class="tag">@one</span><h2><span class="val">Feature: Sample</span></h2><p class="narrative"></p><div class="scenario"><span class="tag">@two</span> <span class="tag">@three</span><h3><span class="keyword">Scenario:</span> <span class="val">Missing</span></h3><ol><li class="step undefined" id="features_sample_feature_7"><div><span class="keyword">Given</span> <span class="step val">missing</span></div></li></ol></div><div class="scenario"><pre class="comment"># Scenario comment<br/></pre><span class="tag">@three</span><h3><span class="keyword">Scenario:</span> <span class="val">Passing</span></h3><ol><li class="step passed" id="features_sample_feature_12"><div><span class="keyword">Given</span> <span class="step val">passing</span></div><table><tr id="row_13"><td class="val" id="row_13_0">a</td><td class="val" id="row_13_1">b</td></tr><tr id="row_14"><td class="val" id="row_14_0">c</td><td class="val" id="row_14_1">d</td></tr></table></li></ol></div><div class="scenario"><span class="tag">@four</span><h3><span class="keyword">Scenario:</span> <span class="val">Failing</span></h3><ol><li class="step failed" id="features_sample_feature_18"><div><span class="keyword">Given</span> <span class="step val">failing</span></div><pre class="val">hello</pre><pre class="failed">FAIL (RuntimeError)
|
170
170
|
./features/step_definitions/sample_steps.rb:2:in `flunker'
|
171
171
|
./features/step_definitions/sample_steps.rb:9:in `/^failing$/'
|
172
172
|
features/sample.feature:18:in `Given failing'</pre></li></ol></div></div><div class="feature"><h2><span class="val">Feature: search examples</span></h2><p class="narrative"></p><div class="background"><h3><span class="keyword">Background:</span> <span class="val">Hantu Pisang background match</span></h3><ol><li class="step passed" id="features_search_sample_feature_4"><div><span class="keyword">Given</span> <span class="step val">passing without a table</span></div></li></ol></div><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">should match Hantu Pisang</span></h3><ol><li class="step passed" id="features_search_sample_feature_7"><div><span class="keyword">Given</span> <span class="step val">passing without a table</span></div></li></ol></div><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">Ignore me</span></h3><ol><li class="step failed" id="features_search_sample_feature_10"><div><span class="keyword">Given</span> <span class="step val">failing without a table</span></div><pre class="failed">FAIL (RuntimeError)
|
@@ -175,9 +175,9 @@ features/sample.feature:18:in `Given failing'</pre></li></ol></div></div><div cl
|
|
175
175
|
features/search_sample.feature:10:in `Given failing without a table'</pre></li></ol></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">Ignore me</span></h3><ol><li class="step skipped" id="features_search_sample_feature_13"><div><span class="keyword">Given</span> <span class="step val"><state> without a table</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_15"><th class="val skipped_param" id="row_15_0">state</th></tr><tr id="row_16"><td class="val failed" id="row_16_0">failing</td></tr><tr><td class="failed" colspan="1"><pre>FAIL (RuntimeError)
|
176
176
|
./features/step_definitions/sample_steps.rb:2:in `flunker'
|
177
177
|
./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
|
178
|
-
features/search_sample.feature:13:in `Given
|
178
|
+
features/search_sample.feature:13:in `Given <state> without a table'</pre></td></tr></table></div></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">Hantu Pisang match</span></h3><ol><li class="step skipped" id="features_search_sample_feature_19"><div><span class="keyword">Given</span> <span class="step val"><state> without a table</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_21"><th class="val skipped_param" id="row_21_0">state</th></tr><tr id="row_22"><td class="val passed" id="row_22_0">passing</td></tr></table></div></div><div class="scenario outline"><h3><span class="keyword">Scenario Outline:</span> <span class="val">no match in name but in examples</span></h3><ol><li class="step skipped" id="features_search_sample_feature_25"><div><span class="keyword">Given</span> <span class="step val"><state> without a table</span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val">Hantu Pisang</span></h4><table><tr id="row_27"><th class="val skipped_param" id="row_27_0">state</th></tr><tr id="row_28"><td class="val passed" id="row_28_0">passing</td></tr></table></div><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val">Ignore me</span></h4><table><tr id="row_31"><th class="val skipped_param" id="row_31_0">state</th></tr><tr id="row_32"><td class="val failed" id="row_32_0">failing</td></tr><tr><td class="failed" colspan="1"><pre>FAIL (RuntimeError)
|
179
179
|
./features/step_definitions/sample_steps.rb:2:in `flunker'
|
180
180
|
./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
|
181
|
-
features/search_sample.feature:25:in `Given
|
181
|
+
features/search_sample.feature:25:in `Given <state> without a table'</pre></td></tr></table></div></div></div><div class="feature"><span class="tag">@sample_one</span><h2><span class="val">Feature: Tag samples</span></h2><p class="narrative"></p><div class="scenario"><span class="tag">@sample_two</span> <span class="tag">@sample_four</span><h3><span class="keyword">Scenario:</span> <span class="val">Passing</span></h3><ol><li class="step undefined" id="features_tags_sample_feature_6"><div><span class="keyword">Given</span> <span class="step val">missing</span></div></li></ol></div><div class="scenario outline"><span class="tag">@sample_three</span><h3><span class="keyword">Scenario Outline:</span> <span class="val"></span></h3><ol><li class="step skipped" id="features_tags_sample_feature_10"><div><span class="keyword">Given</span> <span class="step val"><state></span></div></li></ol><div class="examples"><h4><span class="keyword">Examples:</span> <span class="val"></span></h4><table><tr id="row_12"><th class="val skipped_param" id="row_12_0">state</th></tr><tr id="row_13"><td class="val undefined" id="row_13_0">missing</td></tr></table></div></div><div class="scenario"><span class="tag">@sample_three</span> <span class="tag">@sample_four</span><h3><span class="keyword">Scenario:</span> <span class="val">Skipped</span></h3><ol><li class="step undefined" id="features_tags_sample_feature_17"><div><span class="keyword">Given</span> <span class="step val">missing</span></div></li></ol></div></div><div class="feature"><span class="tag">@lots</span><h2><span class="val">Feature: Tons of cukes</span></h2><p class="narrative"></p><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">Lots and lots</span></h3><ol><li class="step passed" id="features_tons_of_cukes_feature_4"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step failed" id="features_tons_of_cukes_feature_5"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div><pre class="failed">We already have 2 cukes! (RuntimeError)
|
182
182
|
./features/step_definitions/sample_steps.rb:28:in `/^'(.+)' cukes$/'
|
183
|
-
features/tons_of_cukes.feature:5:in `Given '2' cukes'</pre></li><li class="step skipped" id="features_tons_of_cukes_feature_6"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_7"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_8"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_9"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_10"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_11"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_12"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_13"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_14"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_15"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_16"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_17"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_18"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_19"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_20"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_21"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_22"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_23"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_24"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_25"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_26"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_27"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_28"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_29"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_30"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_31"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_32"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_33"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_34"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_35"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_36"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_37"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_38"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_39"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_40"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_41"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_42"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_43"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_44"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_45"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_46"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_47"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_48"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_49"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_50"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_51"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_52"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li></ol></div></div><div class="feature"><h2><span class="val">Feature: undefined multiline args</span></h2><p class="narrative"></p><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">pystring</span></h3><ol><li class="step undefined" id="features_undefined_multiline_args_feature_4"><div><span class="keyword">Given</span> <span class="step val">a pystring</span></div><pre class="val"> example</pre></li></ol></div><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">table</span></h3><ol><li class="step undefined" id="features_undefined_multiline_args_feature_10"><div><span class="keyword">Given</span> <span class="step val">a table</span></div><table><tr id="row_11"><td class="val" id="row_11_0">table</td></tr><tr id="row_12"><td class="val" id="row_12_0">example</td></tr></table></li></ol></div></div><div class="duration">0m30.005s</div></div></body></html>
|
183
|
+
features/tons_of_cukes.feature:5:in `Given '2' cukes'</pre></li><li class="step skipped" id="features_tons_of_cukes_feature_6"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_7"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_8"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_9"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_10"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_11"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_12"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_13"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_14"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_15"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_16"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_17"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_18"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_19"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_20"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_21"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_22"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_23"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_24"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_25"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_26"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_27"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_28"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_29"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_30"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_31"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_32"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_33"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_34"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_35"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_36"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_37"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_38"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_39"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_40"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_41"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_42"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_43"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_44"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_45"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_46"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_47"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_48"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_49"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_50"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_51"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li><li class="step skipped" id="features_tons_of_cukes_feature_52"><div><span class="keyword">Given</span> <span class="step val">'<span class="param">2</span>' cukes</span></div></li></ol></div></div><div class="feature"><h2><span class="val">Feature: Step argument transformations</span></h2><p class="narrative"></p><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">transform with matches</span></h3><ol><li class="step passed" id="features_transform_sample_feature_4"><div><span class="keyword">Then</span> <span class="step val">I should transform <span class="param">'10' to an Integer</span></span></div></li></ol></div><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">transform with matches that capture</span></h3><ol><li class="step passed" id="features_transform_sample_feature_7"><div><span class="keyword">Then</span> <span class="step val">I should transform <span class="param">'abc' to a Symbol</span></span></div></li></ol></div><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">transform without matches</span></h3><ol><li class="step passed" id="features_transform_sample_feature_10"><div><span class="keyword">Then</span> <span class="step val">I should not transform <span class="param">'10'</span> to an Integer</span></div></li></ol></div></div><div class="feature"><h2><span class="val">Feature: undefined multiline args</span></h2><p class="narrative"></p><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">pystring</span></h3><ol><li class="step undefined" id="features_undefined_multiline_args_feature_4"><div><span class="keyword">Given</span> <span class="step val">a pystring</span></div><pre class="val"> example</pre></li></ol></div><div class="scenario"><h3><span class="keyword">Scenario:</span> <span class="val">table</span></h3><ol><li class="step undefined" id="features_undefined_multiline_args_feature_10"><div><span class="keyword">Given</span> <span class="step val">a table</span></div><table><tr id="row_11"><td class="val" id="row_11_0">table</td></tr><tr id="row_12"><td class="val" id="row_12_0">example</td></tr></table></li></ol></div></div><div class="duration">0m30.005s</div></div></body></html>
|
@@ -48,7 +48,7 @@ Given /^I have environment variable (\w+) set to "([^\"]*)"$/ do |variable, valu
|
|
48
48
|
end
|
49
49
|
|
50
50
|
When /^I run cucumber (.*)$/ do |cucumber_opts|
|
51
|
-
run "#{Cucumber::RUBY_BINARY}
|
51
|
+
run "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} --no-color #{cucumber_opts}"
|
52
52
|
end
|
53
53
|
|
54
54
|
When /^I run rake (.*)$/ do |rake_opts|
|
@@ -94,15 +94,15 @@ Then /^"([^\"]*)" with junit duration "([^\"]*)" should contain$/ do |actual_fil
|
|
94
94
|
actual.should == text
|
95
95
|
end
|
96
96
|
|
97
|
-
Then /^"([^\"]*)" should match$/ do |file, text|
|
97
|
+
Then /^"([^\"]*)" should match "([^\"]*)"$/ do |file, text|
|
98
98
|
IO.read(file).should =~ Regexp.new(text)
|
99
99
|
end
|
100
100
|
|
101
101
|
Then /^"([^\"]*)" should have the same contents as "([^\"]*)"$/ do |actual_file, expected_file|
|
102
102
|
actual = IO.read(actual_file)
|
103
103
|
actual = replace_duration(actual, '0m30.005s')
|
104
|
-
# Comment out to replace expected file. Use with care!
|
105
|
-
|
104
|
+
# Comment out to replace expected file. Use with care!
|
105
|
+
File.open(expected_file, "w") {|io| io.write(actual)}
|
106
106
|
actual.should == IO.read(expected_file)
|
107
107
|
end
|
108
108
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: transform
|
2
|
+
In order to maintain modularity within step definitions
|
3
|
+
As a step definition editor
|
4
|
+
I want to register a regex to capture and tranform step definition arguments.
|
5
|
+
|
6
|
+
Scenario: run a specific scenario with a registered transform
|
7
|
+
When I run cucumber -q features/transform_sample.feature --require features
|
8
|
+
Then it should pass with
|
9
|
+
"""
|
10
|
+
Feature: Step argument transformations
|
11
|
+
|
12
|
+
Scenario: transform with matches
|
13
|
+
Then I should transform '10' to an Integer
|
14
|
+
|
15
|
+
Scenario: transform with matches that capture
|
16
|
+
Then I should transform 'abc' to a Symbol
|
17
|
+
|
18
|
+
Scenario: transform without matches
|
19
|
+
Then I should not transform '10' to an Integer
|
20
|
+
|
21
|
+
3 scenarios (3 passed)
|
22
|
+
3 steps (3 passed)
|
23
|
+
|
24
|
+
"""
|
data/features/usage.feature
CHANGED
@@ -116,8 +116,14 @@ Feature: Cucumber command line
|
|
116
116
|
Given passing # features/sample.feature:12
|
117
117
|
/^failing expectation$/ # features/step_definitions/sample_steps.rb:62
|
118
118
|
Given failing expectation # features/failing_expectation.feature:4
|
119
|
+
/^I should transform ('\d+' to an Integer)$/ # features/step_definitions/sample_steps.rb:83
|
120
|
+
Then I should transform '10' to an Integer # features/transform_sample.feature:4
|
121
|
+
/^I should transform ('\w+' to a Symbol)$/ # features/step_definitions/sample_steps.rb:87
|
122
|
+
Then I should transform 'abc' to a Symbol # features/transform_sample.feature:7
|
119
123
|
/^failing$/ # features/step_definitions/sample_steps.rb:8
|
120
124
|
Given failing # features/sample.feature:18
|
125
|
+
/^I should not transform ('\d+') to an Integer$/ # features/step_definitions/sample_steps.rb:91
|
126
|
+
Then I should not transform '10' to an Integer # features/transform_sample.feature:10
|
121
127
|
(::) UNUSED (::)
|
122
128
|
/^unused$/ # features/step_definitions/sample_steps.rb:66
|
123
129
|
/^another unused$/ # features/step_definitions/sample_steps.rb:69
|
data/lib/cucumber/ast/tags.rb
CHANGED
@@ -27,7 +27,9 @@ module Cucumber
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def count(tag)
|
30
|
-
|
30
|
+
# See discussion:
|
31
|
+
# http://github.com/weplay/cucumber/commit/2dc592acdf3f7c1a0c333a8164649936bb82d983
|
32
|
+
if @tag_names.respond_to?(:count) && @tag_names.method(:count).arity > 0
|
31
33
|
@tag_names.count(tag) # 1.9
|
32
34
|
else
|
33
35
|
@tag_names.select{|t| t == tag}.length # 1.8
|
data/lib/cucumber/cli/options.rb
CHANGED
@@ -6,6 +6,9 @@ module Cucumber
|
|
6
6
|
BUILTIN_FORMATS = {
|
7
7
|
'html' => ['Cucumber::Formatter::Html', 'Generates a nice looking HTML report.'],
|
8
8
|
'pretty' => ['Cucumber::Formatter::Pretty', 'Prints the feature as is - in colours.'],
|
9
|
+
'pdf' => ['Cucumber::Formatter::Pdf', "Generates a PDF report. You need to have the\n" +
|
10
|
+
"#{' ' * 51}prawn gem installed. Will pick up logo from\n" +
|
11
|
+
"#{' ' * 51}features/support/logo.png if present."],
|
9
12
|
'profile' => ['Cucumber::Formatter::Profile', 'Prints the 10 slowest steps at the end.'],
|
10
13
|
'progress' => ['Cucumber::Formatter::Progress', 'Prints one character per scenario.'],
|
11
14
|
'rerun' => ['Cucumber::Formatter::Rerun', 'Prints failing files with line numbers.'],
|
@@ -183,6 +186,7 @@ module Cucumber
|
|
183
186
|
@options[:dry_run] = true
|
184
187
|
@quiet = true
|
185
188
|
end
|
189
|
+
|
186
190
|
opts.on("-m", "--no-multiline",
|
187
191
|
"Don't print multiline strings and tables under steps.") do
|
188
192
|
@options[:no_multiline] = true
|
@@ -233,7 +237,7 @@ module Cucumber
|
|
233
237
|
Kernel.exit
|
234
238
|
end
|
235
239
|
end.parse!
|
236
|
-
|
240
|
+
|
237
241
|
if @quiet
|
238
242
|
@options[:snippets] = @options[:source] = false
|
239
243
|
else
|
@@ -253,7 +253,7 @@ module Cucumber
|
|
253
253
|
end
|
254
254
|
|
255
255
|
def format_exception(exception)
|
256
|
-
(["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
|
256
|
+
h((["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n"))
|
257
257
|
end
|
258
258
|
|
259
259
|
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
require 'cucumber/formatter/console'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'prawn'
|
4
|
+
require "prawn/layout"
|
5
|
+
require "prawn/format"
|
6
|
+
|
7
|
+
module Cucumber
|
8
|
+
module Formatter
|
9
|
+
|
10
|
+
BLACK = '000000'
|
11
|
+
GREY = '999999'
|
12
|
+
|
13
|
+
class Pdf < Ast::Visitor
|
14
|
+
include FileUtils
|
15
|
+
include Console
|
16
|
+
attr_writer :indent
|
17
|
+
|
18
|
+
def initialize(step_mother, io, options)
|
19
|
+
super(step_mother)
|
20
|
+
raise "You *must* specify --out FILE for the pdf formatter" unless File === io
|
21
|
+
|
22
|
+
if(options[:dry_run])
|
23
|
+
@status_colors = { :passed => BLACK, :skipped => BLACK, :undefined => BLACK, :failed => BLACK}
|
24
|
+
else
|
25
|
+
@status_colors = { :passed => '055902', :skipped => GREY, :undefined => 'F27405', :failed => '730202'}
|
26
|
+
end
|
27
|
+
|
28
|
+
@pdf = Prawn::Document.new
|
29
|
+
@scrap = Prawn::Document.new
|
30
|
+
@doc = @scrap
|
31
|
+
@io = io
|
32
|
+
@options = options
|
33
|
+
@exceptions = []
|
34
|
+
@indent = 0
|
35
|
+
@buffer = []
|
36
|
+
puts "writing to #{io.path}"
|
37
|
+
begin
|
38
|
+
@pdf.image open("features/support/logo.png"), :position => :center, :width => 500
|
39
|
+
rescue
|
40
|
+
end
|
41
|
+
@pdf.text "\n\n\nCucumber features", :align => :center, :size => 32
|
42
|
+
@pdf.text "Generated: #{Time.now.strftime("%Y-%m-%d %H:%M")}", :size => 10, :at => [0, 24]
|
43
|
+
@pdf.text "Command: <code>cucumber #{ARGV.join(" ")}</code>", :size => 10, :at => [0,10]
|
44
|
+
unless options[:dry_run]
|
45
|
+
@pdf.bounding_box [450,100] , :width => 100 do
|
46
|
+
@pdf.text 'Legend', :size => 10
|
47
|
+
@status_colors.each do |k,v|
|
48
|
+
@pdf.fill_color v
|
49
|
+
@pdf.text k.to_s, :size => 10
|
50
|
+
@pdf.fill_color BLACK
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def keep_with(&block)
|
57
|
+
@buffer << block
|
58
|
+
end
|
59
|
+
|
60
|
+
def render(doc)
|
61
|
+
@doc = doc
|
62
|
+
@buffer.each do |proc|
|
63
|
+
proc.call
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# This method does a 'test' rendering on a blank page, to see the rendered height of the buffer
|
68
|
+
# if that too high for the space left on the age in the real document, we do a page break.
|
69
|
+
# This obviously doesn't work if a scenario is longer than a whole page (God forbid)
|
70
|
+
def flush
|
71
|
+
@scrap.start_new_page
|
72
|
+
oldy = @scrap.y
|
73
|
+
render @scrap
|
74
|
+
height = (oldy - @scrap.y) + 36 # whops magic number
|
75
|
+
if ((@pdf.y - height) < @pdf.bounds.bottom)
|
76
|
+
@pdf.start_new_page
|
77
|
+
end
|
78
|
+
render @pdf
|
79
|
+
@pdf.move_down(20)
|
80
|
+
@buffer = []
|
81
|
+
end
|
82
|
+
|
83
|
+
# regular visitor entries
|
84
|
+
def visit_features(features)
|
85
|
+
super
|
86
|
+
@pdf.render_file(@io.path)
|
87
|
+
puts "\ndone"
|
88
|
+
end
|
89
|
+
|
90
|
+
def visit_feature_name(name)
|
91
|
+
@pdf.start_new_page
|
92
|
+
name["Feature:"] = "" if name["Feature:"]
|
93
|
+
names = name.split("\n")
|
94
|
+
@pdf.fill_color GREY
|
95
|
+
@pdf.text('Feature', :align => :center)
|
96
|
+
@pdf.fill_color BLACK
|
97
|
+
names.each_with_index do |nameline, i|
|
98
|
+
case i
|
99
|
+
when 0
|
100
|
+
@pdf.text(nameline.strip, :size => 30, :align => :center )
|
101
|
+
@pdf.text("\n")
|
102
|
+
else
|
103
|
+
@pdf.text(nameline.strip, :size => 12)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
@pdf.move_down(30)
|
107
|
+
end
|
108
|
+
|
109
|
+
def visit_feature_element(feature_element)
|
110
|
+
record_tag_occurrences(feature_element, @options)
|
111
|
+
super
|
112
|
+
flush
|
113
|
+
end
|
114
|
+
|
115
|
+
def visit_feature(feature)
|
116
|
+
super
|
117
|
+
flush
|
118
|
+
end
|
119
|
+
|
120
|
+
def visit_feature_element_name(keyword, name)
|
121
|
+
names = name.empty? ? [name] : name.split("\n")
|
122
|
+
print "."
|
123
|
+
STDOUT.flush
|
124
|
+
|
125
|
+
keep_with do
|
126
|
+
@doc.move_down(20)
|
127
|
+
@doc.fill_color GREY
|
128
|
+
@doc.text("#{keyword}", :size => 8)
|
129
|
+
@doc.fill_color BLACK
|
130
|
+
@doc.text("#{names[0]}", :size => 16)
|
131
|
+
names[1..-1].each { |s| @doc.text(s, :size => 12) }
|
132
|
+
@doc.text("\n")
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
|
137
|
+
if exception
|
138
|
+
return if @exceptions.index(exception)
|
139
|
+
@exceptions << exception
|
140
|
+
end
|
141
|
+
return if status != :failed && @in_background ^ background
|
142
|
+
@status = status
|
143
|
+
super
|
144
|
+
end
|
145
|
+
|
146
|
+
def colorize(text, status)
|
147
|
+
keep_with do
|
148
|
+
@doc.fill_color(@status_colors[status] || BLACK)
|
149
|
+
@doc.text(text)
|
150
|
+
@doc.fill_color(BLACK)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def visit_step_name(keyword, step_match, status, source_indent, background)
|
155
|
+
line = "<b>#{keyword}</b> #{step_match.format_args("%s").gsub('<', '<').gsub('>', '>')}"
|
156
|
+
colorize(line, status)
|
157
|
+
end
|
158
|
+
|
159
|
+
def visit_background(background)
|
160
|
+
@in_background = true
|
161
|
+
super
|
162
|
+
@in_background = nil
|
163
|
+
end
|
164
|
+
|
165
|
+
def visit_multiline_arg(table)
|
166
|
+
if(table.kind_of? Cucumber::Ast::Table)
|
167
|
+
keep_with do
|
168
|
+
@doc.table(table.rows << table.headers , :position => :center, :row_colors => ['ffffff', 'f0f0f0'])
|
169
|
+
end
|
170
|
+
end
|
171
|
+
super
|
172
|
+
end
|
173
|
+
|
174
|
+
#using row_color hack to highlight each row correctly
|
175
|
+
def visit_outline_table(table)
|
176
|
+
row_colors = table.example_rows.map { |r| @status_colors[r.status] unless r.status == :skipped}
|
177
|
+
keep_with do
|
178
|
+
@doc.table(table.rows, :headers => table.headers, :position => :center, :row_colors => row_colors)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def visit_py_string(string)
|
183
|
+
s = %{"""\n#{string}\n"""}.indent(10)
|
184
|
+
s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}
|
185
|
+
s.each do |line|
|
186
|
+
line.gsub!('<', '<')
|
187
|
+
line.gsub!('>', '>')
|
188
|
+
keep_with { @doc.text line, :size => 8 }
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def visit_comment(comment)
|
193
|
+
comment.accept(self)
|
194
|
+
end
|
195
|
+
|
196
|
+
def visit_comment_line(comment_line)
|
197
|
+
end
|
198
|
+
|
199
|
+
def visit_tag_name(tag_name)
|
200
|
+
tag = format_string("@#{tag_name}", :tag).indent(@indent)
|
201
|
+
# TODO should we render tags at all? skipped for now. difficult to place due to page breaks
|
202
|
+
end
|
203
|
+
|
204
|
+
def visit_background_name(keyword, name, file_colon_line, source_indent)
|
205
|
+
visit_feature_element_name(keyword, name)
|
206
|
+
end
|
207
|
+
|
208
|
+
def visit_examples_name(keyword, name)
|
209
|
+
visit_feature_element_name(keyword, name)
|
210
|
+
end
|
211
|
+
|
212
|
+
def visit_scenario_name(keyword, name, file_colon_line, source_indent)
|
213
|
+
visit_feature_element_name(keyword, name)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
@@ -65,6 +65,15 @@ module Cucumber
|
|
65
65
|
def AfterStep(*tag_names, &proc)
|
66
66
|
RbDsl.register_rb_hook('after_step', tag_names, proc)
|
67
67
|
end
|
68
|
+
|
69
|
+
# Registers a proc that will be called with a step definition argument if it
|
70
|
+
# matches the pattern passed as the first argument to Transform. Alternatively, if
|
71
|
+
# the pattern contains captures then they will be yielded as arguments to the
|
72
|
+
# provided proc. The return value of the proc is consequently yielded to the
|
73
|
+
# step definition.
|
74
|
+
def Transform(*args, &proc)
|
75
|
+
StepMother.register_transform(*args, &proc)
|
76
|
+
end
|
68
77
|
|
69
78
|
# Registers a proc that will run after Cucumber is configured. You can register as
|
70
79
|
# as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
|
@@ -88,4 +97,4 @@ module Cucumber
|
|
88
97
|
end
|
89
98
|
end
|
90
99
|
|
91
|
-
extend(Cucumber::RbSupport::RbDsl)
|
100
|
+
extend(Cucumber::RbSupport::RbDsl)
|
data/lib/cucumber/step_mother.rb
CHANGED
@@ -50,8 +50,9 @@ module Cucumber
|
|
50
50
|
|
51
51
|
# This is the meaty part of Cucumber that ties everything together.
|
52
52
|
class StepMother
|
53
|
-
include Constantize
|
54
|
-
|
53
|
+
include Constantize
|
54
|
+
@@transforms = []
|
55
|
+
StepArgumentTransform = Struct.new(:pattern, :transformer)
|
55
56
|
attr_writer :options, :visitor, :log
|
56
57
|
|
57
58
|
def initialize
|
@@ -60,6 +61,32 @@ module Cucumber
|
|
60
61
|
@language_map = {}
|
61
62
|
load_natural_language('en')
|
62
63
|
end
|
64
|
+
|
65
|
+
def self.register_transform(pattern, &transformer)
|
66
|
+
raise Cucumber::ArityMismatchError.new('Transform must be registered with at least a one-argument block') if !block_given? || transformer.arity < 1
|
67
|
+
@@transforms.unshift StepArgumentTransform.new(Regexp.new(pattern), transformer.to_proc)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.transform_arguments(step_args)
|
71
|
+
matched = nil
|
72
|
+
step_args.map do |step_arg|
|
73
|
+
if transform = @@transforms.detect {|t| matched = t.pattern.match(step_arg) if step_arg.is_a?(String) }
|
74
|
+
if matched.captures.empty?
|
75
|
+
unless transform.transformer.arity == 1
|
76
|
+
raise Cucumber::ArityMismatchError.new("Transforms without Regexp captures only accept a single argument (the step argument)")
|
77
|
+
end
|
78
|
+
transform.transformer.call(step_arg)
|
79
|
+
else
|
80
|
+
if transform.transformer.arity != matched.captures.size
|
81
|
+
raise Cucumber::ArityMismatchError.new("Number of arguments in Transform (#{transform.transformer.arity}) does not match number of Regexp captures (#{matched.captures.size})")
|
82
|
+
end
|
83
|
+
transform.transformer.call(*matched.captures)
|
84
|
+
end
|
85
|
+
else
|
86
|
+
step_arg
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
63
90
|
|
64
91
|
def load_plain_text_features(feature_files)
|
65
92
|
features = Ast::Features.new
|
data/lib/cucumber/version.rb
CHANGED
@@ -24,7 +24,7 @@ When /^I follow "([^\"]*)" within "([^\"]*)"$/ do |link, parent|
|
|
24
24
|
end
|
25
25
|
|
26
26
|
When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
|
27
|
-
fill_in(field, :with => value)
|
27
|
+
fill_in(field, :with => value)
|
28
28
|
end
|
29
29
|
|
30
30
|
When /^I fill in "([^\"]*)" for "([^\"]*)"$/ do |value, field|
|
@@ -49,16 +49,16 @@ When /^I fill in the following:$/ do |fields|
|
|
49
49
|
end
|
50
50
|
|
51
51
|
When /^I select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
|
52
|
-
select(value, :from => field)
|
52
|
+
select(value, :from => field)
|
53
53
|
end
|
54
54
|
|
55
55
|
# Use this step in conjunction with Rail's datetime_select helper. For example:
|
56
|
-
# When I select "December 25, 2008 10:00" as the date and time
|
56
|
+
# When I select "December 25, 2008 10:00" as the date and time
|
57
57
|
When /^I select "([^\"]*)" as the date and time$/ do |time|
|
58
58
|
select_datetime(time)
|
59
59
|
end
|
60
60
|
|
61
|
-
# Use this step when using multiple datetime_select helpers on a page or
|
61
|
+
# Use this step when using multiple datetime_select helpers on a page or
|
62
62
|
# you want to specify which datetime to select. Given the following view:
|
63
63
|
# <%%= f.label :preferred %><br />
|
64
64
|
# <%%= f.datetime_select :preferred %>
|
@@ -74,7 +74,7 @@ end
|
|
74
74
|
# Use this step in conjunction with Rail's time_select helper. For example:
|
75
75
|
# When I select "2:20PM" as the time
|
76
76
|
# Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
|
77
|
-
# will convert the 2:20PM to 14:20 and then select it.
|
77
|
+
# will convert the 2:20PM to 14:20 and then select it.
|
78
78
|
When /^I select "([^\"]*)" as the time$/ do |time|
|
79
79
|
select_time(time)
|
80
80
|
end
|
@@ -100,11 +100,11 @@ When /^I select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
|
|
100
100
|
end
|
101
101
|
|
102
102
|
When /^I check "([^\"]*)"$/ do |field|
|
103
|
-
check(field)
|
103
|
+
check(field)
|
104
104
|
end
|
105
105
|
|
106
106
|
When /^I uncheck "([^\"]*)"$/ do |field|
|
107
|
-
uncheck(field)
|
107
|
+
uncheck(field)
|
108
108
|
end
|
109
109
|
|
110
110
|
When /^I choose "([^\"]*)"$/ do |field|
|
@@ -123,6 +123,16 @@ Then /^I should see "([^\"]*)"$/ do |text|
|
|
123
123
|
<% end -%>
|
124
124
|
end
|
125
125
|
|
126
|
+
Then /^I should see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
|
127
|
+
within(selector) do |content|
|
128
|
+
<% if framework == :rspec -%>
|
129
|
+
content.should contain(text)
|
130
|
+
<% else -%>
|
131
|
+
assert content.include?(text)
|
132
|
+
<% end -%>
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
126
136
|
Then /^I should see \/([^\/]*)\/$/ do |regexp|
|
127
137
|
regexp = Regexp.new(regexp)
|
128
138
|
<% if framework == :rspec -%>
|
@@ -132,6 +142,17 @@ Then /^I should see \/([^\/]*)\/$/ do |regexp|
|
|
132
142
|
<% end -%>
|
133
143
|
end
|
134
144
|
|
145
|
+
Then /^I should see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
|
146
|
+
within(selector) do |content|
|
147
|
+
regexp = Regexp.new(regexp)
|
148
|
+
<% if framework == :rspec -%>
|
149
|
+
content.should contain(regexp)
|
150
|
+
<% else -%>
|
151
|
+
assert content =~ regexp
|
152
|
+
<% end -%>
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
135
156
|
Then /^I should not see "([^\"]*)"$/ do |text|
|
136
157
|
<% if framework == :rspec -%>
|
137
158
|
response.should_not contain(text)
|
@@ -140,6 +161,16 @@ Then /^I should not see "([^\"]*)"$/ do |text|
|
|
140
161
|
<% end -%>
|
141
162
|
end
|
142
163
|
|
164
|
+
Then /^I should not see "([^\"]*)" within "([^\"]*)"$/ do |text, selector|
|
165
|
+
within(selector) do |content|
|
166
|
+
<% if framework == :rspec -%>
|
167
|
+
content.should_not contain(text)
|
168
|
+
<% else -%>
|
169
|
+
assert !content.include?(text)
|
170
|
+
<% end -%>
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
143
174
|
Then /^I should not see \/([^\/]*)\/$/ do |regexp|
|
144
175
|
regexp = Regexp.new(regexp)
|
145
176
|
<% if framework == :rspec -%>
|
@@ -149,6 +180,17 @@ Then /^I should not see \/([^\/]*)\/$/ do |regexp|
|
|
149
180
|
<% end -%>
|
150
181
|
end
|
151
182
|
|
183
|
+
Then /^I should not see \/([^\/]*)\/ within "([^\"]*)"$/ do |regexp, selector|
|
184
|
+
within(selector) do |content|
|
185
|
+
regexp = Regexp.new(regexp)
|
186
|
+
<% if framework == :rspec -%>
|
187
|
+
content.should_not contain(regexp)
|
188
|
+
<% else -%>
|
189
|
+
assert content !~ regexp
|
190
|
+
<% end -%>
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
152
194
|
Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
|
153
195
|
<% if framework == :rspec -%>
|
154
196
|
field_labeled(field).value.should =~ /#{value}/
|
@@ -164,7 +206,7 @@ Then /^the "([^\"]*)" field should not contain "([^\"]*)"$/ do |field, value|
|
|
164
206
|
assert_no_match(/#{value}/, field_labeled(field).value)
|
165
207
|
<% end -%>
|
166
208
|
end
|
167
|
-
|
209
|
+
|
168
210
|
Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
|
169
211
|
<% if framework == :rspec -%>
|
170
212
|
field_labeled(label).should be_checked
|
@@ -184,4 +184,99 @@ or http://wiki.github.com/aslakhellesoy/cucumber/a-whole-new-world.
|
|
184
184
|
@rb.hooks_for(:before, scenario).should == [fish]
|
185
185
|
end
|
186
186
|
end
|
187
|
+
|
188
|
+
describe StepMother, "step argument transformations" do
|
189
|
+
after(:each) do
|
190
|
+
# generally transforms are global, but state should be
|
191
|
+
# cleared when testing them here at the unit level
|
192
|
+
class StepMother; @@transforms = [] end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe "without capture groups" do
|
196
|
+
it "complains when registering with a with no transform block" do
|
197
|
+
lambda do
|
198
|
+
StepMother.register_transform('^abc$')
|
199
|
+
end.should raise_error(Cucumber::ArityMismatchError)
|
200
|
+
end
|
201
|
+
|
202
|
+
it "complains when registering with a zero-arg transform block" do
|
203
|
+
lambda do
|
204
|
+
StepMother.register_transform('^abc$') {42}
|
205
|
+
end.should raise_error(Cucumber::ArityMismatchError)
|
206
|
+
end
|
207
|
+
|
208
|
+
it "complains when registering with a splat-arg transform block" do
|
209
|
+
lambda do
|
210
|
+
StepMother.register_transform('^abc$') {|*splat| 42 }
|
211
|
+
end.should raise_error(Cucumber::ArityMismatchError)
|
212
|
+
end
|
213
|
+
|
214
|
+
it "complains when transforming with an arity mismatch" do
|
215
|
+
lambda do
|
216
|
+
StepMother.register_transform('^abc$') {|one, two| 42 }
|
217
|
+
StepMother.transform_arguments(['abc'])
|
218
|
+
end.should raise_error(Cucumber::ArityMismatchError)
|
219
|
+
end
|
220
|
+
|
221
|
+
it "allows registering a regexp pattern that yields the step_arg matched" do
|
222
|
+
StepMother.register_transform(/^ab*c$/) {|arg| 42}
|
223
|
+
StepMother.transform_arguments(['ab']).should == ['ab']
|
224
|
+
StepMother.transform_arguments(['ac']).should == [42]
|
225
|
+
StepMother.transform_arguments(['abc']).should == [42]
|
226
|
+
StepMother.transform_arguments(['abbc']).should == [42]
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
describe "with capture groups" do
|
231
|
+
it "complains when registering with a with no transform block" do
|
232
|
+
lambda do
|
233
|
+
StepMother.register_transform('^a(.)c$')
|
234
|
+
end.should raise_error(Cucumber::ArityMismatchError)
|
235
|
+
end
|
236
|
+
|
237
|
+
it "complains when registering with a zero-arg transform block" do
|
238
|
+
lambda do
|
239
|
+
StepMother.register_transform('^a(.)c$') { 42 }
|
240
|
+
end.should raise_error(Cucumber::ArityMismatchError)
|
241
|
+
end
|
242
|
+
|
243
|
+
it "complains when registering with a splat-arg transform block" do
|
244
|
+
lambda do
|
245
|
+
StepMother.register_transform('^a(.)c$') {|*splat| 42 }
|
246
|
+
end.should raise_error(Cucumber::ArityMismatchError)
|
247
|
+
end
|
248
|
+
|
249
|
+
it "complains when transforming with an arity mismatch" do
|
250
|
+
lambda do
|
251
|
+
StepMother.register_transform('^a(.)c$') {|one, two| 42 }
|
252
|
+
StepMother.transform_arguments(['abc'])
|
253
|
+
end.should raise_error(Cucumber::ArityMismatchError)
|
254
|
+
end
|
255
|
+
|
256
|
+
it "allows registering a regexp pattern that yields capture groups" do
|
257
|
+
StepMother.register_transform(/^shape: (.+), color: (.+)$/) do |shape, color|
|
258
|
+
{shape.to_sym => color.to_sym}
|
259
|
+
end
|
260
|
+
StepMother.transform_arguments(['shape: circle, color: blue']).should == [{:circle => :blue}]
|
261
|
+
StepMother.transform_arguments(['shape: square, color: red']).should == [{:square => :red}]
|
262
|
+
StepMother.transform_arguments(['not shape: square, not color: red']).should == ['not shape: square, not color: red']
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
it "allows registering a string pattern" do
|
267
|
+
StepMother.register_transform('^ab*c$') {|arg| 42}
|
268
|
+
StepMother.transform_arguments(['ab']).should == ['ab']
|
269
|
+
StepMother.transform_arguments(['ac']).should == [42]
|
270
|
+
StepMother.transform_arguments(['abc']).should == [42]
|
271
|
+
StepMother.transform_arguments(['abbc']).should == [42]
|
272
|
+
end
|
273
|
+
|
274
|
+
it "gives match priority to transforms defined last" do
|
275
|
+
StepMother.register_transform(/^transform_me$/) {|arg| :foo }
|
276
|
+
StepMother.register_transform(/^transform_me$/) {|arg| :bar }
|
277
|
+
StepMother.register_transform(/^transform_me$/) {|arg| :baz }
|
278
|
+
StepMother.transform_arguments(['transform_me']).should == [:baz]
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
187
282
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.101
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Aslak Helles\xC3\xB8y"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-15 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -289,6 +289,7 @@ files:
|
|
289
289
|
- examples/self_test/features/support/env.rb
|
290
290
|
- examples/self_test/features/tags_sample.feature
|
291
291
|
- examples/self_test/features/tons_of_cukes.feature
|
292
|
+
- examples/self_test/features/transform_sample.feature
|
292
293
|
- examples/self_test/features/undefined_multiline_args.feature
|
293
294
|
- examples/self_test/list-of-features.txt
|
294
295
|
- examples/sinatra/README.textile
|
@@ -367,6 +368,7 @@ files:
|
|
367
368
|
- features/steps_formatter.feature
|
368
369
|
- features/support/env.rb
|
369
370
|
- features/table_diffing.feature
|
371
|
+
- features/transform.feature
|
370
372
|
- features/unicode_table.feature
|
371
373
|
- features/usage.feature
|
372
374
|
- features/work_in_progress.feature
|
@@ -427,6 +429,7 @@ files:
|
|
427
429
|
- lib/cucumber/formatter/html.rb
|
428
430
|
- lib/cucumber/formatter/junit.rb
|
429
431
|
- lib/cucumber/formatter/ordered_xml_markup.rb
|
432
|
+
- lib/cucumber/formatter/pdf.rb
|
430
433
|
- lib/cucumber/formatter/pretty.rb
|
431
434
|
- lib/cucumber/formatter/profile.rb
|
432
435
|
- lib/cucumber/formatter/progress.rb
|