cucumber 0.3.101 → 0.3.102

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.
Files changed (62) hide show
  1. data/History.txt +31 -2
  2. data/Manifest.txt +7 -4
  3. data/config/hoe.rb +2 -2
  4. data/examples/pure_java/README.textile +2 -2
  5. data/examples/self_test/features/step_definitions/sample_steps.rb +0 -12
  6. data/examples/self_test/features/support/env.rb +0 -6
  7. data/features/cucumber_cli.feature +11 -24
  8. data/features/custom_formatter.feature +38 -3
  9. data/features/default_snippets.feature +42 -0
  10. data/features/html_formatter/a.html +1 -1
  11. data/features/negative_tagged_hooks.feature +61 -0
  12. data/features/step_definitions/cucumber_steps.rb +1 -1
  13. data/features/support/env.rb +1 -1
  14. data/features/transform.feature +88 -12
  15. data/features/usage.feature +0 -6
  16. data/lib/cucumber/ast/feature.rb +4 -0
  17. data/lib/cucumber/ast/feature_element.rb +49 -42
  18. data/lib/cucumber/ast/step_invocation.rb +1 -1
  19. data/lib/cucumber/ast/tags.rb +25 -3
  20. data/lib/cucumber/cli/drb_client.rb +7 -1
  21. data/lib/cucumber/cli/main.rb +5 -3
  22. data/lib/cucumber/cli/options.rb +15 -24
  23. data/lib/cucumber/constantize.rb +8 -2
  24. data/lib/cucumber/core_ext/instance_exec.rb +2 -1
  25. data/lib/cucumber/core_ext/string.rb +12 -22
  26. data/lib/cucumber/filter.rb +2 -12
  27. data/lib/cucumber/formatter/console.rb +21 -21
  28. data/lib/cucumber/formatter/html.rb +1 -1
  29. data/lib/cucumber/formatter/pdf.rb +1 -1
  30. data/lib/cucumber/formatter/pretty.rb +1 -1
  31. data/lib/cucumber/language_support/language_methods.rb +19 -2
  32. data/lib/cucumber/language_support/step_definition_methods.rb +2 -25
  33. data/lib/cucumber/parser/feature.rb +13 -50
  34. data/lib/cucumber/parser/feature.tt +13 -47
  35. data/lib/cucumber/parser/natural_language.rb +1 -1
  36. data/lib/cucumber/rails/action_controller.rb +33 -0
  37. data/lib/cucumber/rails/active_record.rb +27 -0
  38. data/lib/cucumber/rails/rspec.rb +1 -1
  39. data/lib/cucumber/rails/test_unit.rb +9 -0
  40. data/lib/cucumber/rails/world.rb +7 -78
  41. data/lib/cucumber/rb_support/rb_dsl.rb +6 -4
  42. data/lib/cucumber/rb_support/rb_group.rb +11 -0
  43. data/lib/cucumber/rb_support/rb_language.rb +8 -2
  44. data/lib/cucumber/rb_support/rb_step_definition.rb +23 -8
  45. data/lib/cucumber/rb_support/rb_transform.rb +35 -0
  46. data/lib/cucumber/rb_support/rb_world.rb +7 -1
  47. data/lib/cucumber/step_match.rb +25 -6
  48. data/lib/cucumber/step_mother.rb +9 -32
  49. data/lib/cucumber/version.rb +1 -1
  50. data/rails_generators/cucumber/templates/cucumber_environment.rb +2 -2
  51. data/rails_generators/cucumber/templates/env.rb +1 -8
  52. data/spec/cucumber/ast/feature_element_spec.rb +24 -23
  53. data/spec/cucumber/ast/scenario_outline_spec.rb +1 -1
  54. data/spec/cucumber/cli/options_spec.rb +5 -14
  55. data/spec/cucumber/core_ext/string_spec.rb +11 -13
  56. data/spec/cucumber/parser/feature_parser_spec.rb +6 -6
  57. data/spec/cucumber/step_mother_spec.rb +41 -38
  58. metadata +11 -8
  59. data/examples/self_test/features/transform_sample.feature +0 -10
  60. data/spec/cucumber/rails/stubs/mini_rails.rb +0 -18
  61. data/spec/cucumber/rails/stubs/test_help.rb +0 -1
  62. data/spec/cucumber/rails/world_spec.rb +0 -16
data/History.txt CHANGED
@@ -1,6 +1,35 @@
1
- == In Git
1
+ == 2009-09-22
2
2
 
3
- Step Argument Transforms
3
+ This release has some changes in the Rails support, so make sure you run "script/generate cucumber" after you upgrade.
4
+ Other noteworthy new features are improved Hook, tags and Transform support, and as always - several smaler bug fixes.
5
+
6
+ === New Features
7
+ * Added new internal API for Regexp and groups, allowing other programming languages to leverage native regexps. (Aslak Hellesøy)
8
+ * New @allow_rescue tag for Rails scenarios. Causes exceptions raised in actions to be caught by rails and not bubble up to Cucumber (Aslak Hellesøy)
9
+ * Negative tags can now be used in hooks, just like the command line's --tags option: Before('~@yarr') - will run for all scenarios that *don't* have the @yarr tag. (Aslak Hellesøy)
10
+ * Transform has current "World" scope (Larry Diehl)
11
+ * Other Transforms can be reused by calling Transform with a string inside of another Transform definition (Larry Diehl)
12
+ * Execute "After" hooks in reverse order of declaration for better behavior with dependent blocks and to mimic the behavior of at_exit (David Waite)
13
+
14
+ === Bugfixes
15
+ * features/support/env.rb runs commands twice (bugfix cuts total time by almost 50% w00t) (#452 Jim Meyer)
16
+ * Problems adding custom formatters to features/support. (features/support is added to $LOAD_PATH) (#449 Aslak Hellesøy)
17
+ * Some options set in cucumber.yml profiles are ignored (#446 Leonard CHIN)
18
+ * Missing step_definition snippets not properly displayed (#433 Aslak Hellesøy)
19
+ * rspec-rails, :lib => false (#447 David Chelimsky)
20
+ * Cucumber with Spork breaks on OS X Snow Leopard (#431 David Chelimsky)
21
+
22
+ === Changed Features
23
+ * Tag names passed on the command line *always* have to use the @ sign. --tags foo or --tags ~bar won't work. Use --tags @foo or --tags ~@bar (Aslak Hellesøy)
24
+
25
+ === Removed features
26
+ * The Cucumber::Rails.bypass_rescue no longer exists. Errors will always bubble up, unless you use the new @allow_rescue tag. (Aslak Hellesøy)
27
+ * The Cucumber::Rails.use_transactional_fixtures no longer exists. Transactional fixtures are always enabled for the cucumber environment. (Aslak Hellesøy)
28
+
29
+ == 0.3.101 2009-09-15
30
+
31
+ Two exciting things in this release. Step Argument Transforms and a PDF formatter you can use to send
32
+ your features to your customer for review!
4
33
 
5
34
  === New Features
6
35
  * New pdf formatter (#425 Mads Buus)
data/Manifest.txt CHANGED
@@ -211,7 +211,6 @@ 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
215
214
  examples/self_test/features/undefined_multiline_args.feature
216
215
  examples/self_test/list-of-features.txt
217
216
  examples/sinatra/README.textile
@@ -269,6 +268,7 @@ features/cucumber_cli.feature
269
268
  features/cucumber_cli_diff_disabled.feature
270
269
  features/cucumber_cli_outlines.feature
271
270
  features/custom_formatter.feature
271
+ features/default_snippets.feature
272
272
  features/drb_server_integration.feature
273
273
  features/exception_in_after_block.feature
274
274
  features/exception_in_after_step_block.feature
@@ -280,6 +280,7 @@ features/html_formatter/a.html
280
280
  features/junit_formatter.feature
281
281
  features/language_from_header.feature
282
282
  features/multiline_names.feature
283
+ features/negative_tagged_hooks.feature
283
284
  features/post_configuration_hook.feature
284
285
  features/profiles.feature
285
286
  features/rake_task.feature
@@ -377,13 +378,18 @@ lib/cucumber/platform.rb
377
378
  lib/cucumber/py_support/py_dsl.py
378
379
  lib/cucumber/py_support/py_language.py
379
380
  lib/cucumber/py_support/py_language.rb
381
+ lib/cucumber/rails/action_controller.rb
382
+ lib/cucumber/rails/active_record.rb
380
383
  lib/cucumber/rails/rspec.rb
384
+ lib/cucumber/rails/test_unit.rb
381
385
  lib/cucumber/rails/world.rb
382
386
  lib/cucumber/rake/task.rb
383
387
  lib/cucumber/rb_support/rb_dsl.rb
388
+ lib/cucumber/rb_support/rb_group.rb
384
389
  lib/cucumber/rb_support/rb_hook.rb
385
390
  lib/cucumber/rb_support/rb_language.rb
386
391
  lib/cucumber/rb_support/rb_step_definition.rb
392
+ lib/cucumber/rb_support/rb_transform.rb
387
393
  lib/cucumber/rb_support/rb_world.rb
388
394
  lib/cucumber/rspec_neuter.rb
389
395
  lib/cucumber/step_match.rb
@@ -429,9 +435,6 @@ spec/cucumber/formatter/html_spec.rb
429
435
  spec/cucumber/formatter/progress_spec.rb
430
436
  spec/cucumber/parser/feature_parser_spec.rb
431
437
  spec/cucumber/parser/table_parser_spec.rb
432
- spec/cucumber/rails/stubs/mini_rails.rb
433
- spec/cucumber/rails/stubs/test_help.rb
434
- spec/cucumber/rails/world_spec.rb
435
438
  spec/cucumber/rb_support/rb_step_definition_spec.rb
436
439
  spec/cucumber/sell_cucumbers.feature
437
440
  spec/cucumber/step_mother_spec.rb
data/config/hoe.rb CHANGED
@@ -62,8 +62,8 @@ $hoe = Hoe.spec(GEM_NAME) do |p|
62
62
  #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
63
63
  p.extra_deps = [
64
64
  ['term-ansicolor', '>= 1.0.3'],
65
- ['treetop', '>= 1.3.0'],
66
- ['polyglot', '>= 0.2.8'], # Don't really want polyglot, but it keeps breaking so we'll make people use something that works ok'ish
65
+ ['treetop', '>= 1.4.2'],
66
+ ['polyglot', '>= 0.2.9'], # Don't really want polyglot, but it keeps breaking so we'll make people use something that works ok'ish
67
67
  ['diff-lcs', '>= 1.1.2'],
68
68
  ['builder', '>= 2.1.2']
69
69
  ]
@@ -1,5 +1,5 @@
1
1
  h1. Cucumber with pure Java
2
2
 
3
- You can use Cucumber with step definitions in pure Java.
3
+ Nothing here in the Cucumber codebase, but check out "Cuke4Duke":http://wiki.github.com/aslakhellesoy/cuke4duke
4
4
 
5
- See http://github.com/aslakhellesoy/cucumber_java/tree/master
5
+ Cuke4Duke lets you write step definitions in Java, Groovy and an increasing number of languages that run on the JVM.
@@ -79,15 +79,3 @@ 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,9 +16,3 @@ 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 }
@@ -351,17 +351,6 @@ 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
-
365
354
  Feature: undefined multiline args
366
355
 
367
356
  Scenario: pystring
@@ -375,8 +364,8 @@ Feature: Cucumber command line
375
364
  | table |
376
365
  | example |
377
366
 
378
- 29 scenarios (20 skipped, 8 undefined, 1 passed)
379
- 45 steps (33 skipped, 12 undefined)
367
+ 26 scenarios (17 skipped, 8 undefined, 1 passed)
368
+ 42 steps (30 skipped, 12 undefined)
380
369
 
381
370
  """
382
371
 
@@ -453,7 +442,7 @@ Feature: Cucumber command line
453
442
 
454
443
 
455
444
  Scenario: Run with a tag that exists on 2 scenarios
456
- When I run cucumber -q features --tags three
445
+ When I run cucumber -q features --tags @three
457
446
  Then it should pass with
458
447
  """
459
448
  # Feature comment
@@ -478,7 +467,7 @@ Feature: Cucumber command line
478
467
 
479
468
  @mri186
480
469
  Scenario: Run with a tag that exists on 1 feature
481
- When I run cucumber -q features --tags one
470
+ When I run cucumber -q features --tags @one
482
471
  Then it should fail with
483
472
  """
484
473
  # Feature comment
@@ -516,7 +505,7 @@ Feature: Cucumber command line
516
505
  """
517
506
 
518
507
  Scenario: Run with a negative tag
519
- When I run cucumber -q features/sample.feature --dry-run -t ~four
508
+ When I run cucumber -q features/sample.feature --dry-run --tags ~@four
520
509
  Then it should pass with
521
510
  """
522
511
  # Feature comment
@@ -539,8 +528,8 @@ Feature: Cucumber command line
539
528
 
540
529
  """
541
530
 
542
- Scenario: Run with limited tag number
543
- When I run cucumber -q features/tags_sample.feature --dry-run -t sample_three:1
531
+ Scenario: Run with limited tag count, blowing it on scenario
532
+ When I run cucumber -q features/tags_sample.feature --dry-run --tags @sample_three:1
544
533
  Then it should fail with
545
534
  """
546
535
  @sample_one
@@ -561,15 +550,14 @@ Feature: Cucumber command line
561
550
  2 scenarios (2 undefined)
562
551
  2 steps (2 undefined)
563
552
 
564
- Failed due to exceeding the tag limit
565
- @sample_three occurred:2 limit:1
553
+ @sample_three occurred 2 times, but the limit was set to 1
566
554
  features/tags_sample.feature:9
567
555
  features/tags_sample.feature:16
568
556
 
569
557
  """
570
558
 
571
- Scenario: Run with a feature tag which has a limit
572
- When I run cucumber -q features/tags_sample.feature --dry-run -t sample_one:1
559
+ Scenario: Run with limited tag count, blowing it via feature inheritance
560
+ When I run cucumber -q features/tags_sample.feature --dry-run --tags @sample_one:1
573
561
  Then it should fail with
574
562
  """
575
563
  @sample_one
@@ -594,8 +582,7 @@ Feature: Cucumber command line
594
582
  3 scenarios (3 undefined)
595
583
  3 steps (3 undefined)
596
584
 
597
- Failed due to exceeding the tag limit
598
- @sample_one occurred:3 limit:1
585
+ @sample_one occurred 3 times, but the limit was set to 1
599
586
  features/tags_sample.feature:5
600
587
  features/tags_sample.feature:9
601
588
  features/tags_sample.feature:16
@@ -4,8 +4,43 @@ Feature: Custom Formatter
4
4
  When I run cucumber --format Cucumber::Formatter::TagCloud features
5
5
  Then it should fail with
6
6
  """
7
- | after_file | background_tagged_before_on_outline | four | lots | one | sample_four | sample_one | sample_three | sample_two | three | two |
8
- | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 2 | 1 | 2 | 1 |
7
+ | @after_file | @background_tagged_before_on_outline | @four | @lots | @one | @sample_four | @sample_one | @sample_three | @sample_two | @three | @two |
8
+ | 1 | 1 | 1 | 1 | 1 | 2 | 1 | 2 | 1 | 2 | 1 |
9
9
 
10
10
  """
11
-
11
+
12
+ Scenario: my own formatter
13
+ Given a standard Cucumber project directory structure
14
+ And a file named "features/f.feature" with:
15
+ """
16
+ Feature: i'll use my own
17
+ Scenario: just print me
18
+ Given this step works
19
+ """
20
+ And a file named "features/step_definitions/steps.rb" with:
21
+ """
22
+ Given /^this step works$/ do
23
+ end
24
+ """
25
+ And a file named "features/support/ze/formator.rb" with:
26
+ """
27
+ module Ze
28
+ class Formator < Cucumber::Ast::Visitor
29
+ def initialize(step_mother, io, options)
30
+ super(step_mother)
31
+ @io = io
32
+ end
33
+
34
+ def visit_scenario_name(keyword, name, file_colon_line, source_indent)
35
+ @io.puts "$ #{name.upcase}"
36
+ end
37
+ end
38
+ end
39
+ """
40
+ When I run cucumber features/f.feature --format Ze::Formator
41
+ Then STDERR should be empty
42
+ Then it should pass with
43
+ """
44
+ $ JUST PRINT ME
45
+
46
+ """
@@ -0,0 +1,42 @@
1
+ Feature: Print snippets
2
+ In order to make it easier to implement step definitions
3
+ Developers should get a scaffolding for undefined step definitions
4
+
5
+ Scenario: Cucumber doesn't know what language, and defaults to Ruby
6
+ Given a standard Cucumber project directory structure
7
+ And a file named "features/x.feature" with:
8
+ """
9
+ Feature: X
10
+ Scenario: Y
11
+ Given Z
12
+ Given Q
13
+ """
14
+ When I run cucumber features
15
+ Then STDERR should be empty
16
+ And it should pass with
17
+ """
18
+ Feature: X
19
+
20
+ Scenario: Y # features/x.feature:2
21
+ Given Z # features/x.feature:3
22
+ Given Q # features/x.feature:4
23
+
24
+ 1 scenario (1 undefined)
25
+ 2 steps (2 undefined)
26
+
27
+ You can implement step definitions for undefined steps with these snippets:
28
+
29
+ Given /^Z$/ do
30
+ pending
31
+ end
32
+
33
+ Given /^Q$/ do
34
+ pending
35
+ end
36
+
37
+ If you want snippets in a different programming language, just make sure a file
38
+ with the appropriate file extension exists where cucumber looks for step definitions.
39
+
40
+
41
+ """
42
+
@@ -180,4 +180,4 @@ features/search_sample.feature:13:in `Given &lt;state&gt; without a table'</pre>
180
180
  ./features/step_definitions/sample_steps.rb:16:in `/^failing without a table$/'
181
181
  features/search_sample.feature:25:in `Given &lt;state&gt; 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">&lt;state&gt;</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: 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>
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>
@@ -0,0 +1,61 @@
1
+ Feature: Tagged hooks
2
+
3
+ Background:
4
+ Given a standard Cucumber project directory structure
5
+ And a file named "features/step_definitions/steps.rb" with:
6
+ """
7
+ Given /^this step works$/ do
8
+ end
9
+ """
10
+ And a file named "features/support/hooks.rb" with:
11
+ """
12
+ Before('~@no-boom') do
13
+ raise 'boom'
14
+ end
15
+ """
16
+ And a file named "features/f.feature" with:
17
+ """
18
+ Feature: With and without hooks
19
+ Scenario: using hook
20
+ Given this step works
21
+
22
+ @no-boom
23
+ Scenario: omitting hook
24
+ Given this step works
25
+ """
26
+
27
+ Scenario: omit tagged hook
28
+ When I run cucumber features/f.feature:2
29
+ Then it should fail with
30
+ """
31
+ Feature: With and without hooks
32
+
33
+ Scenario: using hook # features/f.feature:2
34
+ boom (RuntimeError)
35
+ ./features/support/hooks.rb:2:in `Before'
36
+ Given this step works # features/step_definitions/steps.rb:1
37
+
38
+ Failing Scenarios:
39
+ cucumber features/f.feature:2 # Scenario: using hook
40
+
41
+ 1 scenario (1 failed)
42
+ 1 step (1 skipped)
43
+
44
+ """
45
+
46
+ Scenario: omit tagged hook
47
+ When I run cucumber features/f.feature:6
48
+ Then it should pass with
49
+ """
50
+ Feature: With and without hooks
51
+
52
+ @no-boom
53
+ Scenario: omitting hook # features/f.feature:6
54
+ Given this step works # features/step_definitions/steps.rb:1
55
+
56
+ 1 scenario (1 passed)
57
+ 1 step (1 passed)
58
+
59
+ """
60
+
61
+
@@ -102,7 +102,7 @@ Then /^"([^\"]*)" should have the same contents as "([^\"]*)"$/ do |actual_file,
102
102
  actual = IO.read(actual_file)
103
103
  actual = replace_duration(actual, '0m30.005s')
104
104
  # Comment out to replace expected file. Use with care!
105
- File.open(expected_file, "w") {|io| io.write(actual)}
105
+ # File.open(expected_file, "w") {|io| io.write(actual)}
106
106
  actual.should == IO.read(expected_file)
107
107
  end
108
108
 
@@ -61,6 +61,7 @@ class CucumberWorld
61
61
  def create_file(file_name, file_content)
62
62
  file_content.gsub!("CUCUMBER_LIB", "'#{cucumber_lib_dir}'") # Some files, such as Rakefiles need to use the lib dir
63
63
  in_current_dir do
64
+ FileUtils.mkdir_p(File.dirname(file_name)) unless File.directory?(File.dirname(file_name))
64
65
  File.open(file_name, 'w') { |f| f << file_content }
65
66
  end
66
67
  end
@@ -83,7 +84,6 @@ class CucumberWorld
83
84
  stderr_file = Tempfile.new('cucumber')
84
85
  stderr_file.close
85
86
  in_current_dir do
86
- @last_stdout = `#{command} 2> #{stderr_file.path}`
87
87
  mode = Cucumber::RUBY_1_9 ? {:external_encoding=>"UTF-8"} : 'r'
88
88
  IO.popen("#{command} 2> #{stderr_file.path}", mode) do |io|
89
89
  @last_stdout = io.read
@@ -3,22 +3,98 @@ Feature: transform
3
3
  As a step definition editor
4
4
  I want to register a regex to capture and tranform step definition arguments.
5
5
 
6
+ Background:
7
+ Given a standard Cucumber project directory structure
8
+ And a file named "features/step_definitions/steps.rb" with:
9
+ """
10
+ Then /^I should transform ('\d+' to an Integer)$/ do |integer|
11
+ integer.should be_kind_of(Integer)
12
+ end
13
+
14
+ Then /^I should transform ('\w+' to a Symbol)$/ do |symbol|
15
+ symbol.should be_kind_of(Symbol)
16
+ end
17
+
18
+ Then /^I should transform ('\d+' to a Float)$/ do |float|
19
+ float.should be_kind_of(Float)
20
+ end
21
+
22
+ Then /^I should transform ('\w+' to an Array)$/ do |array|
23
+ array.should be_kind_of(Array)
24
+ end
25
+
26
+ Then /^I should not transform ('\d+') to an Integer$/ do |string|
27
+ string.should be_kind_of(String)
28
+ end
29
+ """
30
+ And a file named "features/support/env.rb" with:
31
+ """
32
+ Transform /^'\d+' to an Integer$/ do |step_arg|
33
+ /'(\d+)' to an Integer/.match(step_arg).captures[0].to_i
34
+ end
35
+
36
+ Transform /^'(\d+)' to a Float$/ do |integer_string|
37
+ Float.induced_from Transform("'#{integer_string}' to an Integer")
38
+ end
39
+
40
+ Transform(/^('\w+') to a Symbol$/) {|str| str.to_sym }
41
+
42
+ module MyHelpers
43
+ def fetch_array
44
+ @array
45
+ end
46
+ end
47
+
48
+ World(MyHelpers)
49
+
50
+ Before do
51
+ @array = []
52
+ end
53
+
54
+ Transform(/^('\w+') to an Array$/) {|str| fetch_array }
55
+ """
56
+
6
57
  Scenario: run a specific scenario with a registered transform
7
- When I run cucumber -q features/transform_sample.feature --require features
58
+ Given a file named "features/transform_sample.feature" with:
59
+ """
60
+ Feature: Step argument transformations
61
+
62
+ Scenario: transform with matches
63
+ Then I should transform '10' to an Integer
64
+
65
+ Scenario: transform with matches that capture
66
+ Then I should transform 'abc' to a Symbol
67
+
68
+ Scenario: transform with matches that reuse transforms
69
+ Then I should transform '10' to a Float
70
+
71
+ Scenario: transform with matches that use current world
72
+ Then I should transform 'abc' to an Array
73
+
74
+ Scenario: transform without matches
75
+ Then I should not transform '10' to an Integer
76
+ """
77
+ When I run cucumber -s features
8
78
  Then it should pass with
9
- """
10
- Feature: Step argument transformations
79
+ """
80
+ Feature: Step argument transformations
11
81
 
12
- Scenario: transform with matches
13
- Then I should transform '10' to an Integer
82
+ Scenario: transform with matches
83
+ Then I should transform '10' to an Integer
84
+
85
+ Scenario: transform with matches that capture
86
+ Then I should transform 'abc' to a Symbol
87
+
88
+ Scenario: transform with matches that reuse transforms
89
+ Then I should transform '10' to a Float
14
90
 
15
- Scenario: transform with matches that capture
16
- Then I should transform 'abc' to a Symbol
91
+ Scenario: transform with matches that use current world
92
+ Then I should transform 'abc' to an Array
17
93
 
18
- Scenario: transform without matches
19
- Then I should not transform '10' to an Integer
94
+ Scenario: transform without matches
95
+ Then I should not transform '10' to an Integer
20
96
 
21
- 3 scenarios (3 passed)
22
- 3 steps (3 passed)
97
+ 5 scenarios (5 passed)
98
+ 5 steps (5 passed)
23
99
 
24
- """
100
+ """