cucumber 0.1.12 → 0.1.13

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 (101) hide show
  1. data/History.txt +38 -3
  2. data/Manifest.txt +17 -1
  3. data/README.txt +2 -39
  4. data/bin/cucumber +1 -1
  5. data/examples/calculator_ruby_features/features/addition.rb +16 -0
  6. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -1
  7. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -0
  8. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +1 -0
  9. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +1 -0
  10. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +1 -0
  11. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -0
  12. data/examples/i18n/fr/features/addition.feature +13 -11
  13. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +6 -2
  14. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +1 -0
  15. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -0
  16. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +2 -0
  17. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +1 -0
  18. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +1 -0
  19. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -0
  20. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -0
  21. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -0
  22. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +1 -0
  23. data/examples/selenium/features/search.feature +1 -1
  24. data/examples/selenium/features/step_definitons/stories_steps.rb +2 -3
  25. data/examples/tickets/features/lib/eatting_machine.rb +18 -0
  26. data/examples/tickets/features/lib/pantry.rb +20 -0
  27. data/examples/tickets/features/scenario_outline.feature +64 -0
  28. data/examples/tickets/features/step_definitons/scenario_outline_steps.rb +34 -0
  29. data/examples/tickets/features/step_definitons/tickets_steps.rb +4 -0
  30. data/gem_tasks/fix_cr_lf.rake +1 -1
  31. data/gem_tasks/yard.rake +8 -0
  32. data/lib/autotest/cucumber_mixin.rb +3 -3
  33. data/lib/cucumber.rb +2 -0
  34. data/lib/cucumber/broadcaster.rb +1 -1
  35. data/lib/cucumber/cli.rb +87 -42
  36. data/lib/cucumber/core_ext/exception.rb +20 -0
  37. data/lib/cucumber/core_ext/string.rb +1 -1
  38. data/lib/cucumber/executor.rb +35 -18
  39. data/lib/cucumber/formatters/ansicolor.rb +65 -74
  40. data/lib/cucumber/formatters/html_formatter.rb +33 -10
  41. data/lib/cucumber/formatters/pretty_formatter.rb +58 -16
  42. data/lib/cucumber/formatters/progress_formatter.rb +3 -0
  43. data/lib/cucumber/formatters/unicode.rb +27 -0
  44. data/lib/cucumber/languages.yml +6 -4
  45. data/lib/cucumber/platform.rb +1 -0
  46. data/lib/cucumber/rails/world.rb +6 -6
  47. data/lib/cucumber/step_mother.rb +3 -0
  48. data/lib/cucumber/tree/feature.rb +28 -2
  49. data/lib/cucumber/tree/scenario.rb +62 -1
  50. data/lib/cucumber/tree/step.rb +32 -1
  51. data/lib/cucumber/treetop_parser/feature.treetop.erb +54 -7
  52. data/lib/cucumber/treetop_parser/feature_ar.rb +377 -18
  53. data/lib/cucumber/treetop_parser/feature_cy.rb +377 -18
  54. data/lib/cucumber/treetop_parser/feature_da.rb +377 -18
  55. data/lib/cucumber/treetop_parser/feature_de.rb +377 -18
  56. data/lib/cucumber/treetop_parser/feature_en-lol.rb +377 -18
  57. data/lib/cucumber/treetop_parser/feature_en-tx.rb +377 -18
  58. data/lib/cucumber/treetop_parser/feature_en.rb +377 -18
  59. data/lib/cucumber/treetop_parser/feature_es.rb +377 -18
  60. data/lib/cucumber/treetop_parser/feature_et.rb +377 -18
  61. data/lib/cucumber/treetop_parser/feature_fr.rb +389 -30
  62. data/lib/cucumber/treetop_parser/feature_id.rb +377 -18
  63. data/lib/cucumber/treetop_parser/feature_it.rb +377 -18
  64. data/lib/cucumber/treetop_parser/feature_ja.rb +377 -18
  65. data/lib/cucumber/treetop_parser/feature_lt.rb +377 -18
  66. data/lib/cucumber/treetop_parser/feature_nl.rb +377 -18
  67. data/lib/cucumber/treetop_parser/feature_no.rb +377 -18
  68. data/lib/cucumber/treetop_parser/feature_pl.rb +377 -18
  69. data/lib/cucumber/treetop_parser/feature_pt.rb +377 -18
  70. data/lib/cucumber/treetop_parser/feature_ro.rb +377 -18
  71. data/lib/cucumber/treetop_parser/feature_ro2.rb +377 -18
  72. data/lib/cucumber/treetop_parser/feature_ru.rb +377 -18
  73. data/lib/cucumber/treetop_parser/feature_se.rb +377 -18
  74. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +377 -18
  75. data/lib/cucumber/version.rb +1 -1
  76. data/lib/cucumber/world.rb +1 -0
  77. data/lib/cucumber/world/pending.rb +22 -0
  78. data/rails_generators/cucumber/templates/env.rb +1 -0
  79. data/rails_generators/feature/feature_generator.rb +22 -2
  80. data/rails_generators/feature/templates/feature.erb +15 -12
  81. data/rails_generators/feature/templates/steps.erb +16 -14
  82. data/spec/cucumber/cli_spec.rb +87 -6
  83. data/spec/cucumber/executor_spec.rb +102 -30
  84. data/spec/cucumber/formatters/ansicolor_spec.rb +10 -10
  85. data/spec/cucumber/formatters/html_formatter_spec.rb +30 -0
  86. data/spec/cucumber/formatters/pretty_formatter_spec.rb +139 -4
  87. data/spec/cucumber/formatters/progress_formatter_spec.rb +16 -0
  88. data/spec/cucumber/tree/feature_spec.rb +84 -5
  89. data/spec/cucumber/tree/row_scenario_outline_spec.rb +73 -0
  90. data/spec/cucumber/tree/row_step_outline_spec.rb +38 -0
  91. data/spec/cucumber/tree/scenario_outline_spec.rb +50 -0
  92. data/spec/cucumber/tree/step_outline_spec.rb +17 -0
  93. data/spec/cucumber/tree/step_spec.rb +9 -0
  94. data/spec/cucumber/treetop_parser/empty_scenario_outline.feature +3 -0
  95. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +22 -0
  96. data/spec/cucumber/treetop_parser/invalid_scenario_outlines.feature +7 -0
  97. data/spec/cucumber/treetop_parser/scenario_outline.feature +16 -0
  98. data/spec/cucumber/world/pending_spec.rb +46 -0
  99. data/spec/spec_helper.rb +2 -1
  100. metadata +19 -4
  101. data/TODO.txt +0 -26
@@ -2,7 +2,7 @@ module Cucumber #:nodoc:
2
2
  class VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- TINY = 12
5
+ TINY = 13
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1 @@
1
+ %w{pending}.each{|f| require "cucumber/world/#{f}"}
@@ -0,0 +1,22 @@
1
+ module Cucumber
2
+ module World
3
+ module Pending
4
+
5
+ ##
6
+ # Mark this step as pending
7
+ def pending(message = "TODO")
8
+ if block_given?
9
+ begin
10
+ yield
11
+ rescue Exception => e
12
+ raise Cucumber::ForcedPending.new(message)
13
+ end
14
+ raise Cucumber::ForcedPending.new("Expected pending '#{message}' to fail. No Error was raised.")
15
+ else
16
+ raise Cucumber::ForcedPending.new(message)
17
+ end
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -2,6 +2,7 @@
2
2
  ENV["RAILS_ENV"] = "test"
3
3
  require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
4
4
  require 'cucumber/rails/world'
5
+ require 'cucumber/formatters/unicode' # Comment out this line if you don't want Cucumber Unicode support
5
6
  Cucumber::Rails.use_transactional_fixtures
6
7
 
7
8
  require 'webrat/rails'
@@ -8,9 +8,29 @@ class FeatureGenerator < Rails::Generator::NamedBase
8
8
  end
9
9
  end
10
10
 
11
- protected
11
+ class NamedArg
12
+ attr_reader :name
13
+
14
+ def initialize(s)
15
+ @name, @type = *s.split(':')
16
+ end
17
+
18
+ def value(n)
19
+ if @type == 'boolean'
20
+ (n % 2) == 0
21
+ else
22
+ "#{@name} #{n}"
23
+ end
24
+ end
25
+ end
26
+
27
+ def named_args
28
+ args.map{|arg| NamedArg.new(arg)}
29
+ end
30
+
31
+ protected
12
32
 
13
33
  def banner
14
34
  "Usage: #{$0} feature ModelName [field:type, field:type]"
15
35
  end
16
- end
36
+ end
@@ -6,23 +6,26 @@ Feature: Manage <%= plural_name %>
6
6
  Scenario: Register new <%= singular_name %>
7
7
  Given I am on the new <%= singular_name %> page
8
8
  <% keyword = 'When' -%>
9
- <% args.each do |arg| -%>
10
- <%= keyword %> I fill in "<%= arg.humanize %>" with "My <%= singular_name %> <%= arg %>"
9
+ <% named_args.each do |arg| -%>
10
+ <%= keyword %> I fill in "<%= arg.name.humanize %>" with "<%= arg.value(1) %>"
11
11
  <% keyword = 'And' -%>
12
12
  <% end -%>
13
13
  And I press "Create"
14
14
  <% keyword = 'Then' -%>
15
- <% args.each do |arg| -%>
16
- <%= keyword %> I should see "My <%= singular_name %> <%= arg %>"
15
+ <% named_args.each do |arg| -%>
16
+ <%= keyword %> I should see "<%= arg.value(1) %>"
17
17
  <% keyword = 'And' -%>
18
18
  <% end -%>
19
19
 
20
20
  Scenario: Delete <%= singular_name %>
21
- Given there are 4 <%= plural_name %>
22
- When I delete the first <%= singular_name %>
23
- Then there should be 3 <%= plural_name %> left
24
-
25
- More Examples:
26
- | initial | after |
27
- | 100 | 99 |
28
- | 1 | 0 |
21
+ Given the following <%= plural_name %>:
22
+ |<%= named_args.map(&:name).join('|') %>|
23
+ <% (1..4).each do |n| -%>
24
+ |<%= named_args.map{|arg| arg.value(n)}.join('|') %>|
25
+ <% end -%>
26
+ When I delete the 3rd <%= singular_name %>
27
+ Then I should see the following <%= plural_name %>:
28
+ |<%= named_args.map(&:name).join('|') %>|
29
+ <% [1,2,4].each do |n| -%>
30
+ |<%= named_args.map{|arg| arg.value(n)}.join('|') %>|
31
+ <% end -%>
@@ -1,22 +1,24 @@
1
1
  Given /I am on the new <%= singular_name %> page/ do
2
- visits "/<%= plural_name %>/new"
2
+ visit "/<%= plural_name %>/new"
3
3
  end
4
4
 
5
- Given /there are (\d+) <%= plural_name %>/ do |n|
6
- <%= class_name %>.transaction do
7
- <%= class_name %>.destroy_all
8
- n.to_i.times do |n|
9
- <%= class_name %>.create! :name => "<%= class_name %> #{n}"
10
- end
11
- end
5
+ Given /^the following <%= plural_name %>:$/ do |<%= plural_name %>|
6
+ <%= class_name %>.create!(<%= plural_name %>.hashes)
12
7
  end
13
8
 
14
- When /I delete the first <%= singular_name %>/ do
15
- visits <%= plural_name %>_url
16
- clicks_link "Destroy"
9
+ When /^I delete the (\d+)(?:st|nd|rd|th) <%= singular_name %>$/ do |pos|
10
+ visit <%= plural_name %>_url
11
+ within("table > tr:nth-child(#{pos.to_i+1})") do
12
+ click_link "Destroy"
13
+ end
17
14
  end
18
15
 
19
- Then /there should be (\d+) <%= plural_name %> left/ do |n|
20
- <%= class_name %>.count.should == n.to_i
21
- response.should have_tag("table tr", n.to_i + 1) # There is a header row too
16
+ Then /^I should see the following <%= plural_name %>:$/ do |<%= plural_name %>|
17
+ <%= plural_name %>.raw[1..-1].each_with_index do |row, i|
18
+ row.each_with_index do |cell, j|
19
+ response.should have_selector("table > tr:nth-child(#{i+2}) > td:nth-child(#{j+1})") { |td|
20
+ td.inner_text.should == cell
21
+ }
22
+ end
23
+ end
22
24
  end
@@ -17,12 +17,12 @@ module Cucumber
17
17
  end
18
18
 
19
19
  before(:each) do
20
- Kernel.stub!(:exit)
20
+ Kernel.stub!(:exit).and_return(nil)
21
21
  end
22
22
 
23
- def given_cucumber_yml_defined_as(hash)
23
+ def given_cucumber_yml_defined_as(hash_or_string)
24
24
  File.stub!(:exist?).and_return(true)
25
- cucumber_yml = hash.to_yaml
25
+ cucumber_yml = hash_or_string.is_a?(Hash) ? hash_or_string.to_yaml : hash_or_string
26
26
  IO.stub!(:read).with('cucumber.yml').and_return(cucumber_yml)
27
27
  end
28
28
 
@@ -73,6 +73,18 @@ Defined profiles in cucumber.yml:
73
73
  error.string.should == "Profiles must be defined as a String. The 'foo' profile was [1, 2, 3] (Array).\n"
74
74
  end
75
75
 
76
+ it "should provide a helpful error message when a specified profile exists but is nil or blank" do
77
+ [nil, ' '].each do |bad_input|
78
+ cli = CLI.new(StringIO.new, error = StringIO.new)
79
+
80
+ given_cucumber_yml_defined_as({'foo' => bad_input})
81
+
82
+ cli.parse_options!(%w{--profile foo})
83
+
84
+ error.string.should match(/The 'foo' profile in cucumber.yml was blank. Please define the command line arguments for the 'foo' profile in cucumber.yml./)
85
+ end
86
+ end
87
+
76
88
  it "should provide a helpful error message when no YAML file exists and a profile is specified" do
77
89
  cli = CLI.new(StringIO.new, error = StringIO.new)
78
90
 
@@ -80,7 +92,32 @@ Defined profiles in cucumber.yml:
80
92
 
81
93
  cli.parse_options!(%w{--profile i_do_not_exist})
82
94
 
83
- error.string.should match(/cucumber.yml was not found. Please define your 'i_do_not_exist' and other profiles in cucumber.yml./)
95
+ error.string.should match(/cucumber.yml was not found. Please refer to cucumber's documentaion on defining profiles in cucumber.yml./)
96
+ end
97
+
98
+ it "should provide a helpful error message when cucumber.yml is blank or malformed" do
99
+ expected_error_message = /cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentaion on correct profile usage./
100
+
101
+ ['', 'sfsadfs', "--- \n- an\n- array\n", "---dddfd"].each do |bad_input|
102
+ cli = CLI.new(StringIO.new, error = StringIO.new)
103
+
104
+ given_cucumber_yml_defined_as(bad_input)
105
+ cli.parse_options!([])
106
+
107
+ error.string.should match(expected_error_message)
108
+ end
109
+ end
110
+
111
+ it "should procide a helpful error message when the YAML can not be parsed" do
112
+ expected_error_message = /cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentaion on correct profile usage./
113
+ cli = CLI.new(StringIO.new, error = StringIO.new)
114
+
115
+ given_cucumber_yml_defined_as("input that causes an exception in YAML loading")
116
+ YAML.should_receive(:load).and_raise Exception
117
+
118
+ cli.parse_options!([])
119
+
120
+ error.string.should match(expected_error_message)
84
121
  end
85
122
 
86
123
  it "should accept --no-source option" do
@@ -112,6 +149,21 @@ Defined profiles in cucumber.yml:
112
149
  cli.options[:verbose].should be_true
113
150
  end
114
151
 
152
+ it "should require files in support paths first" do
153
+ File.stub!(:directory?).and_return(true)
154
+ Dir.stub!(:[]).and_return(["/features/step_definitions/foo.rb","/features/support/env.rb"])
155
+
156
+ cli = CLI.new(StringIO.new)
157
+ cli.parse_options!(%w{--require /features})
158
+
159
+ cli.should_receive(:require).twice.with(/treetop_parser/).ordered
160
+ cli.should_receive(:require).with("/features/support/env.rb").ordered
161
+ cli.should_receive(:require).with("/features/step_definitions/foo.rb").ordered
162
+ cli.should_receive(:require).with("spec/expectations/differs/default").ordered
163
+
164
+ cli.execute!(stub('step mother'), mock_executor, mock_features)
165
+ end
166
+
115
167
  describe "verbose mode" do
116
168
 
117
169
  before(:each) do
@@ -384,6 +436,36 @@ Defined profiles in cucumber.yml:
384
436
  cli.execute!(stub('step mother'), mock_executor, stub('features'))
385
437
  end
386
438
 
439
+ describe "--backtrace" do
440
+ before do
441
+ Exception.cucumber_full_backtrace = false
442
+ end
443
+
444
+ it "should show full backtrace when --backtrace is present" do
445
+ cli = CLI.new
446
+ cli.parse_options!(['--backtrace'])
447
+ begin
448
+ "x".should == "y"
449
+ rescue => e
450
+ e.cucumber_backtrace[0].should_not == "#{__FILE__}:#{__LINE__ - 2}"
451
+ end
452
+ end
453
+
454
+ it "should strip gems when --backtrace is absent" do
455
+ cli = CLI.new
456
+ cli.parse_options!(['--'])
457
+ begin
458
+ "x".should == "y"
459
+ rescue => e
460
+ e.cucumber_backtrace[0].should == "#{__FILE__}:#{__LINE__ - 2}"
461
+ end
462
+ end
463
+
464
+ after do
465
+ Exception.cucumber_full_backtrace = false
466
+ end
467
+ end
468
+
387
469
  describe "example.feature:line file arguments" do
388
470
 
389
471
  it "should extract line numbers" do
@@ -413,8 +495,7 @@ Defined profiles in cucumber.yml:
413
495
 
414
496
  cli.options[:lines_for_features].should == {'example.feature' => [11, 12]}
415
497
  end
416
-
417
- end
498
+ end
418
499
 
419
500
  it "should search for all features in the specified directory" do
420
501
  cli = CLI.new
@@ -10,10 +10,24 @@ module Cucumber
10
10
  :name => 'test',
11
11
  :accept => nil,
12
12
  :steps => [],
13
- :pending? => true
13
+ :pending? => true,
14
+ :outline? => false,
14
15
  }.merge(stubs))
15
16
  end
16
17
 
18
+ def parse_features(feature_file)
19
+ parser = TreetopParser::FeatureParser.new
20
+ feature = parser.parse_feature(feature_file)
21
+ end
22
+
23
+ before do
24
+ ::Term::ANSIColor.coloring = false
25
+ end
26
+
27
+ after do
28
+ ::Term::ANSIColor.coloring = true
29
+ end
30
+
17
31
  before do # TODO: Way more setup and duplication of lib code. Use lib code!
18
32
  @io = StringIO.new
19
33
  @step_mother = StepMother.new
@@ -21,9 +35,8 @@ module Cucumber
21
35
  @formatters = Broadcaster.new [Formatters::ProgressFormatter.new(@io)]
22
36
  @executor.formatters = @formatters
23
37
  @feature_file = File.dirname(__FILE__) + '/sell_cucumbers.feature'
24
- @parser = TreetopParser::FeatureParser.new
25
- @features = Tree::Features.new
26
- @feature = @parser.parse_feature(@feature_file)
38
+ @features = features = Tree::Features.new
39
+ @feature = parse_features(@feature_file)
27
40
  @features << @feature
28
41
  end
29
42
 
@@ -46,7 +59,7 @@ module Cucumber
46
59
 
47
60
  1)
48
61
  dang
49
- #{__FILE__}:43:in `Then /I should owe (\\d*) cucumbers/'
62
+ #{__FILE__}:56:in `Then /I should owe (\\d*) cucumbers/'
50
63
  #{@feature_file}:9:in `Then I should owe 7 cucumbers'
51
64
  })
52
65
  end
@@ -75,6 +88,13 @@ dang
75
88
  world.doit.should == "dunit"
76
89
  world.beatit.should == "beatenit"
77
90
  end
91
+
92
+ it "should add support for calling 'pending' from world" do
93
+ world = @executor.create_world
94
+
95
+ world.should respond_to(:pending)
96
+ end
97
+
78
98
  end
79
99
 
80
100
  describe "visiting feature" do
@@ -162,6 +182,54 @@ dang
162
182
  end
163
183
 
164
184
  end
185
+
186
+ describe "visiting step outline" do
187
+
188
+ it "should trace step" do
189
+ mock_formatter = mock('formatter')
190
+ @executor.formatters = mock_formatter
191
+ mock_step_outline = mock('step outline', :regexp_args_proc => [])
192
+
193
+ mock_formatter.should_receive(:step_traced)
194
+
195
+ @executor.visit_step_outline(mock_step_outline)
196
+ end
197
+
198
+ end
199
+
200
+ describe "visit forced pending step" do
201
+
202
+ before(:each) do
203
+ @executor.formatters = mock('formatter', :null_object => true)
204
+ end
205
+
206
+ it "should store the pending exception with the step" do
207
+ mock_step = mock("mock step", :regexp_args_proc => nil)
208
+ pending_exception = ForcedPending.new("implement me")
209
+ mock_step.stub!(:execute_in).and_raise(pending_exception)
210
+
211
+ mock_step.should_receive(:'error=').with(pending_exception)
212
+
213
+ @executor.visit_step(mock_step)
214
+ end
215
+
216
+ describe "after failed/pending step" do
217
+
218
+ it "should store the pending exception with the step" do
219
+ mock_step_1 = mock("mock step", :null_object => true)
220
+ mock_step_2 = mock("mock step", :regexp_args_proc => nil)
221
+ pending_exception = ForcedPending.new("implement me")
222
+ mock_step_1.stub!(:execute_in).and_raise(StandardError)
223
+ mock_step_2.stub!(:execute_in).and_raise(pending_exception)
224
+
225
+ mock_step_2.should_receive(:'error=').with(pending_exception)
226
+
227
+ @executor.visit_step(mock_step_1)
228
+ @executor.visit_step(mock_step_2)
229
+ end
230
+
231
+ end
232
+ end
165
233
 
166
234
  describe "visiting row scenarios" do
167
235
 
@@ -175,40 +243,44 @@ dang
175
243
  }.merge(stubs))
176
244
  end
177
245
 
178
- describe "without having first run the matching regular scenario" do
179
-
246
+ %w{regular_scenario scenario_outline}.each do |regular_or_outline|
247
+
180
248
  before(:each) do
181
- @regular_scenario = Tree::Scenario.new(nil, 'test', 1)
249
+ @scenario = mock("#{regular_or_outline} scenario", :name => 'test', :at_line? => true, :pending? => false, :accept => nil)
250
+
182
251
  @executor.lines_for_features = Hash.new([5])
183
- @executor.visit_regular_scenario(@regular_scenario)
252
+ @executor.send("visit_#{regular_or_outline}".to_sym, @scenario)
184
253
  end
254
+
255
+ describe "without having first run the matching #{regular_or_outline}" do
185
256
 
186
- it "should run the regular scenario before the row scenario" do
187
- @regular_scenario.should_receive(:accept)
188
- row_scenario = mock_row_scenario(:name => 'test', :at_line? => true)
189
- row_scenario.should_receive(:accept)
190
- @executor.visit_row_scenario(row_scenario)
191
- end
257
+ it "should run the #{regular_or_outline} before the row scenario" do
258
+ @scenario.should_receive(:accept)
259
+ row_scenario = mock_row_scenario(:name => 'test', :at_line? => true)
260
+ row_scenario.should_receive(:accept)
192
261
 
193
- it "should run the row scenario after running the regular scenario" do
194
- row_scenario = mock_row_scenario(:at_line? => true)
195
- row_scenario.should_receive(:accept)
196
- @executor.visit_row_scenario(row_scenario)
197
- end
198
-
199
- end
262
+ @executor.visit_row_scenario(row_scenario)
263
+ end
264
+
265
+ it "should run the row scenario after running the #{regular_or_outline}" do
266
+ row_scenario = mock_row_scenario(:at_line? => true)
267
+ row_scenario.should_receive(:accept)
268
+ @scenario.stub!(:accept)
200
269
 
201
- describe "having run matching regular scenario" do
270
+ @executor.visit_row_scenario(row_scenario)
271
+ end
202
272
 
203
- it "should not run the regular scenario if it has already run" do
204
- scenario = Tree::Scenario.new(nil, 'test', 1)
205
- @executor.visit_regular_scenario(scenario)
273
+ end
206
274
 
207
- scenario.should_not_receive(:accept)
275
+ describe "having run matching #{regular_or_outline}" do
276
+
277
+ it "should not run the regular scenario if it has already run" do
278
+ @scenario.should_not_receive(:accept)
208
279
 
209
- @executor.visit_row_scenario(mock_row_scenario(:name => 'test', :at_line? => true, :accept => nil))
210
- end
280
+ @executor.visit_row_scenario(mock_row_scenario(:name => 'test', :at_line? => true, :accept => nil))
281
+ end
211
282
 
283
+ end
212
284
  end
213
285
  end
214
286
 
@@ -293,6 +365,6 @@ dang
293
365
  @executor.visit_features(@features)
294
366
  end
295
367
  end
296
-
368
+
297
369
  end
298
370
  end