kosmas58-cucumber 0.1.99.23 → 0.1.100.5

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 (100) hide show
  1. data/History.txt +8 -23
  2. data/Manifest.txt +14 -2
  3. data/examples/i18n/en-lol/Rakefile +6 -0
  4. data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +16 -0
  5. data/examples/i18n/en-lol/features/stuffing.feature +8 -0
  6. data/examples/i18n/en-lol/features/support/env.rb +8 -0
  7. data/examples/i18n/en-lol/lib/basket.rb +12 -0
  8. data/examples/i18n/en-lol/lib/belly.rb +11 -0
  9. data/examples/i18n/et/features/jagamine.feature +9 -0
  10. data/examples/jbehave/README.textile +4 -1
  11. data/examples/jbehave/features/trading.feature +4 -0
  12. data/examples/jbehave/pom.xml +5 -0
  13. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +6 -1
  14. data/examples/selenium/features/step_definitons/search_steps.rb +13 -0
  15. data/examples/selenium/features/support/env.rb +19 -0
  16. data/examples/selenium_webrat/Rakefile +6 -0
  17. data/examples/selenium_webrat/features/search.feature +9 -0
  18. data/examples/selenium_webrat/features/step_definitons/search_steps.rb +13 -0
  19. data/examples/selenium_webrat/features/support/env.rb +41 -0
  20. data/examples/self_test/Rakefile +1 -1
  21. data/examples/self_test/features/background/failing_background.feature +1 -0
  22. data/examples/self_test/features/step_definitions/sample_steps.rb +1 -1
  23. data/examples/self_test/features/support/tag_count_formatter.rb +1 -1
  24. data/examples/tickets/Rakefile +13 -8
  25. data/examples/tickets/cucumber.yml +2 -1
  26. data/examples/tickets/features/236.feature +13 -0
  27. data/examples/tickets/features/241.feature +13 -0
  28. data/examples/tickets/features/step_definitons/tickets_steps.rb +17 -4
  29. data/examples/tickets/features/tickets.feature +1 -1
  30. data/features/background.feature +9 -11
  31. data/features/cucumber_cli.feature +24 -1
  32. data/features/cucumber_cli_outlines.feature +10 -19
  33. data/features/report_called_undefined_steps.feature +2 -0
  34. data/gem_tasks/rspec.rake +3 -2
  35. data/lib/cucumber.rb +7 -15
  36. data/lib/cucumber/ast.rb +3 -3
  37. data/lib/cucumber/ast/background.rb +28 -66
  38. data/lib/cucumber/ast/examples.rb +15 -3
  39. data/lib/cucumber/ast/feature.rb +20 -24
  40. data/lib/cucumber/ast/feature_element.rb +46 -0
  41. data/lib/cucumber/ast/features.rb +2 -21
  42. data/lib/cucumber/ast/outline_table.rb +46 -14
  43. data/lib/cucumber/ast/py_string.rb +9 -3
  44. data/lib/cucumber/ast/scenario.rb +34 -73
  45. data/lib/cucumber/ast/scenario_outline.rb +40 -42
  46. data/lib/cucumber/ast/step.rb +51 -90
  47. data/lib/cucumber/ast/step_collection.rb +66 -0
  48. data/lib/cucumber/ast/step_invocation.rb +110 -0
  49. data/lib/cucumber/ast/table.rb +41 -21
  50. data/lib/cucumber/ast/tags.rb +4 -11
  51. data/lib/cucumber/ast/visitor.rb +35 -19
  52. data/lib/cucumber/broadcaster.rb +1 -3
  53. data/lib/cucumber/cli/configuration.rb +25 -17
  54. data/lib/cucumber/cli/language_help_formatter.rb +4 -4
  55. data/lib/cucumber/cli/main.rb +6 -4
  56. data/lib/cucumber/core_ext/proc.rb +2 -2
  57. data/lib/cucumber/formatter/ansicolor.rb +0 -1
  58. data/lib/cucumber/formatter/console.rb +24 -34
  59. data/lib/cucumber/formatter/html.rb +18 -11
  60. data/lib/cucumber/formatter/pretty.rb +48 -36
  61. data/lib/cucumber/formatter/profile.rb +6 -6
  62. data/lib/cucumber/formatter/progress.rb +14 -22
  63. data/lib/cucumber/formatter/rerun.rb +6 -6
  64. data/lib/cucumber/jbehave.rb +21 -26
  65. data/lib/cucumber/languages.yml +17 -2
  66. data/lib/cucumber/parser/feature.rb +26 -29
  67. data/lib/cucumber/parser/feature.tt +17 -12
  68. data/lib/cucumber/parser/treetop_ext.rb +13 -13
  69. data/lib/cucumber/platform.rb +0 -1
  70. data/lib/cucumber/rails/world.rb +2 -2
  71. data/lib/cucumber/rake/task.rb +1 -2
  72. data/lib/cucumber/step_definition.rb +21 -12
  73. data/lib/cucumber/step_match.rb +49 -0
  74. data/lib/cucumber/step_mother.rb +100 -80
  75. data/lib/cucumber/version.rb +2 -2
  76. data/lib/cucumber/world.rb +53 -0
  77. data/rails_generators/cucumber/templates/paths.rb +1 -1
  78. data/rails_generators/cucumber/templates/webrat_steps.rb +17 -17
  79. data/rails_generators/feature/feature_generator.rb +5 -1
  80. data/rails_generators/feature/templates/steps.erb +0 -4
  81. data/spec/cucumber/ast/background_spec.rb +32 -41
  82. data/spec/cucumber/ast/feature_factory.rb +10 -1
  83. data/spec/cucumber/ast/feature_spec.rb +7 -30
  84. data/spec/cucumber/ast/py_string_spec.rb +7 -0
  85. data/spec/cucumber/ast/scenario_outline_spec.rb +3 -0
  86. data/spec/cucumber/ast/scenario_spec.rb +8 -25
  87. data/spec/cucumber/ast/step_collection_spec.rb +8 -0
  88. data/spec/cucumber/ast/step_spec.rb +49 -28
  89. data/spec/cucumber/ast/table_spec.rb +13 -3
  90. data/spec/cucumber/ast/tags_spec.rb +2 -18
  91. data/spec/cucumber/broadcaster_spec.rb +6 -5
  92. data/spec/cucumber/cli/configuration_spec.rb +7 -0
  93. data/spec/cucumber/cli/main_spec.rb +1 -1
  94. data/spec/cucumber/parser/feature_parser_spec.rb +6 -5
  95. data/spec/cucumber/step_definition_spec.rb +16 -5
  96. data/spec/cucumber/step_mother_spec.rb +6 -6
  97. data/spec/cucumber/world/pending_spec.rb +1 -1
  98. metadata +24 -5
  99. data/lib/cucumber/ast/filter.rb +0 -22
  100. data/lib/cucumber/ast/steps.rb +0 -13
@@ -5,23 +5,13 @@ module Cucumber
5
5
  attr_accessor :file
6
6
  attr_writer :features, :lines
7
7
 
8
- def initialize(comment, tags, name, feature_elements, background = nil)
9
- @comment, @tags, @name, @feature_elements, @background = comment, tags, name, feature_elements, background
10
- feature_elements.each do |feature_element|
11
- feature_element.feature = self
12
- feature_element.background = background if background
13
- end
14
- background.feature = self if background
8
+ def initialize(background, comment, tags, name, feature_elements)
9
+ @background, @comment, @tags, @name, @feature_elements = background, comment, tags, name, feature_elements
15
10
  @lines = []
16
- end
17
11
 
18
- def tagged_with?(tag_names, check_elements=true)
19
- @tags.among?(tag_names) ||
20
- (check_elements && @feature_elements.detect{|e| e.tagged_with?(tag_names)})
21
- end
22
-
23
- def matches_scenario_names?(scenario_names)
24
- @feature_elements.detect{|e| e.matches_scenario_names?(scenario_names)}
12
+ @feature_elements.each do |feature_element|
13
+ feature_element.feature = self
14
+ end
25
15
  end
26
16
 
27
17
  def accept(visitor)
@@ -29,25 +19,31 @@ module Cucumber
29
19
  visitor.visit_comment(@comment)
30
20
  visitor.visit_tags(@tags)
31
21
  visitor.visit_feature_name(@name)
32
-
22
+ visitor.visit_background(@background) if @background
33
23
  @feature_elements.each do |feature_element|
34
- visitor.visit_feature_element(feature_element) if @features.visit?(feature_element, @lines)
24
+ visitor.visit_feature_element(feature_element) if feature_element.descend?(visitor)
35
25
  end
36
26
  end
37
27
 
38
- def scenario_executed(scenario)
39
- @features.scenario_executed(scenario) if @features
28
+ def descend?(visitor)
29
+ @feature_elements.detect{ |feature_element| feature_element.descend?(visitor) }
30
+ end
31
+
32
+ def has_tags?(tags)
33
+ @tags.has_tags?(tags)
40
34
  end
41
35
 
42
- def step_executed(step)
43
- @features.step_executed(step) if @features
36
+ def next_feature_element(feature_element, &proc)
37
+ index = @feature_elements.index(feature_element)
38
+ next_one = @feature_elements[index+1]
39
+ proc.call(next_one) if next_one
44
40
  end
45
41
 
46
42
  def backtrace_line(step_name, line)
47
- "#{file_line(line)}:in `#{step_name}'"
43
+ "#{file_colon_line(line)}:in `#{step_name}'"
48
44
  end
49
45
 
50
- def file_line(line)
46
+ def file_colon_line(line)
51
47
  "#{@file}:#{line}"
52
48
  end
53
49
 
@@ -58,7 +54,7 @@ module Cucumber
58
54
  tags = @tags.to_sexp
59
55
  sexp += tags if tags.any?
60
56
  sexp += [@background.to_sexp] if @background
61
- sexp += @feature_elements.map{|e| e.to_sexp}
57
+ sexp += @feature_elements.map{|fe| fe.to_sexp}
62
58
  sexp
63
59
  end
64
60
  end
@@ -0,0 +1,46 @@
1
+ module Cucumber
2
+ module FeatureElement
3
+ def attach_steps(steps)
4
+ steps.each {|step| step.feature_element = self}
5
+ end
6
+
7
+ def file_colon_line(line = @line)
8
+ @feature.file_colon_line(line) if @feature
9
+ end
10
+
11
+ def text_length
12
+ @keyword.jlength + @name.jlength
13
+ end
14
+
15
+ def matches_lines?(lines)
16
+ lines.index(@line) || @steps.matches_lines?(lines) || @tags.matches_lines?(lines)
17
+ end
18
+
19
+ def has_tags?(tags)
20
+ @tags.has_tags?(tags) || @feature.has_tags?(tags)
21
+ end
22
+
23
+ def matches_scenario_names?(scenario_names)
24
+ scenario_names.detect{|name| name == @name}
25
+ end
26
+
27
+ def backtrace_line(name = "#{@keyword} #{@name}", line = @line)
28
+ @feature.backtrace_line(name, line) if @feature
29
+ end
30
+
31
+ def source_indent(text_length)
32
+ max_line_length - text_length
33
+ end
34
+
35
+ def max_line_length
36
+ @steps.max_line_length(self)
37
+ end
38
+
39
+ # TODO: Remove when we use StepCollection everywhere
40
+ def previous_step(step)
41
+ i = @steps.index(step) || -1
42
+ @steps[i-1]
43
+ end
44
+
45
+ end
46
+ end
@@ -1,14 +1,8 @@
1
1
  module Cucumber
2
2
  module Ast
3
3
  class Features
4
- attr_reader :steps, :scenarios
5
-
6
- def initialize(filter)
7
- @filter = filter
8
-
4
+ def initialize
9
5
  @features = []
10
- @scenarios = []
11
- @steps = Hash.new{|steps, status| steps[status] = []}
12
6
  end
13
7
 
14
8
  def add_feature(feature)
@@ -16,22 +10,9 @@ module Cucumber
16
10
  @features << feature
17
11
  end
18
12
 
19
- def visit?(node, lines)
20
- @filter.matched?(node) &&
21
- (lines.empty? ? true : node.at_lines?(lines))
22
- end
23
-
24
- def scenario_executed(scenario)
25
- @scenarios << scenario
26
- end
27
-
28
- def step_executed(step)
29
- @steps[step.status] << step
30
- end
31
-
32
13
  def accept(visitor)
33
14
  @features.each do |feature|
34
- visitor.visit_feature(feature) if visit?(feature, [])
15
+ visitor.visit_feature(feature) if feature.descend?(visitor)
35
16
  end
36
17
  end
37
18
  end
@@ -5,35 +5,67 @@ module Cucumber
5
5
  super(raw)
6
6
  @scenario_outline = scenario_outline
7
7
  @cells_class = ExampleCells
8
+
9
+ cells_rows.each do |cells|
10
+ cells.create_step_invocations!(scenario_outline)
11
+ end
8
12
  end
9
13
 
10
- def accept(visitor, status)
14
+ def accept(visitor)
11
15
  cells_rows.each_with_index do |row, n|
12
- should_visit = n == 0 ||
13
- row.at_lines?(visitor.current_feature_lines) ||
14
- @scenario_outline.at_header_or_step_lines?(visitor.current_feature_lines)
15
-
16
- if should_visit
17
- visitor.visit_table_row(row, status)
16
+ if n == 0 || matches?(visitor, row)
17
+ visitor.visit_table_row(row)
18
18
  end
19
19
  end
20
20
  nil
21
21
  end
22
22
 
23
- def execute_row(cells, visitor, &proc)
24
- @scenario_outline.execute_row(cells, visitor, &proc)
23
+ def descend?(visitor)
24
+ cells_rows.detect{|cells_row| cells_row.descend?(visitor)}
25
+ end
26
+
27
+ def matches?(visitor, cells)
28
+ @scenario_outline.matches_tags_and_name?(visitor) &&
29
+ (visitor.matches_lines?(cells) || visitor.matches_lines?(@scenario_outline))
30
+ end
31
+
32
+ def skip_invoke!
33
+ cells_rows.each do |cells|
34
+ cells.skip_invoke!
35
+ end
25
36
  end
26
37
 
27
38
  class ExampleCells < Cells
28
- def accept(visitor, status)
39
+ def create_step_invocations!(scenario_outline)
40
+ @step_invocations = scenario_outline.step_invocations(self)
41
+ end
42
+
43
+ def descend?(visitor)
44
+ @table.matches?(visitor, self)
45
+ end
46
+
47
+ def skip_invoke!
48
+ @step_invocations.each do |step_invocation|
49
+ step_invocation.skip_invoke!
50
+ end
51
+ end
52
+
53
+ def accept(visitor)
29
54
  if header?
30
55
  @cells.each do |cell|
31
- visitor.visit_table_cell(cell, :thead)
56
+ cell.status = :skipped
57
+ visitor.visit_table_cell(cell)
32
58
  end
33
- nil
34
59
  else
35
- exception = @table.execute_row(self, visitor) do |cell, status|
36
- visitor.visit_table_cell(cell, status)
60
+ visitor.step_mother.before_and_after(self) do
61
+ @step_invocations.each do |step_invocation|
62
+ step_invocation.invoke(visitor.step_mother, visitor.options)
63
+ @exception ||= step_invocation.exception
64
+ end
65
+
66
+ @cells.each do |cell|
67
+ visitor.visit_table_cell(cell)
68
+ end
37
69
  end
38
70
  end
39
71
  end
@@ -20,23 +20,29 @@ module Cucumber
20
20
  def initialize(start_line, end_line, string, quotes_indent)
21
21
  @start_line, @end_line = start_line, end_line
22
22
  @string, @quotes_indent = string.gsub(/\\"/, '"'), quotes_indent
23
+ @status = :passed
24
+ end
25
+
26
+ def status=(status)
27
+ @status = status
23
28
  end
24
29
 
25
30
  def to_s
26
31
  @string.indent(-@quotes_indent)
27
32
  end
28
33
 
29
- def at_lines?(lines)
34
+ def matches_lines?(lines)
30
35
  lines.detect{|l| l >= @start_line && l <= @end_line}
31
36
  end
32
37
 
33
- def accept(visitor, status)
34
- visitor.visit_py_string(to_s, status)
38
+ def accept(visitor)
39
+ visitor.visit_py_string(to_s, @status)
35
40
  end
36
41
 
37
42
  def arguments_replaced(arguments) #:nodoc:
38
43
  string = @string
39
44
  arguments.each do |name, value|
45
+ value ||= ''
40
46
  string = string.gsub(name, value)
41
47
  end
42
48
  PyString.new(@start_line, @end_line, string, @quotes_indent)
@@ -1,91 +1,51 @@
1
+ require 'cucumber/ast/feature_element'
2
+
1
3
  module Cucumber
2
4
  module Ast
3
5
  class Scenario
4
- attr_writer :feature, :background
5
-
6
- def initialize(comment, tags, line, keyword, name, steps)
7
- @comment, @tags, @line, @keyword, @name = comment, tags, line, keyword, name
8
- steps.each {|step| step.scenario = self}
9
- @steps = steps
10
- @steps_helper = Steps.new(self)
11
- end
12
-
13
- def status
14
- @steps.map{|step| step.status}
6
+ include FeatureElement
7
+
8
+ def initialize(background, comment, tags, line, keyword, name, steps)
9
+ @background, @comment, @tags, @line, @keyword, @name = background, comment, tags, line, keyword, name
10
+ attach_steps(steps)
11
+
12
+ step_invocations = steps.map{|step| step.step_invocation}
13
+ if @background
14
+ @steps = @background.step_collection(step_invocations)
15
+ else
16
+ @steps = StepCollection.new(step_invocations)
17
+ end
15
18
  end
16
19
 
17
- def tagged_with?(tag_names)
18
- @tags.among?(tag_names) || @feature.tagged_with?(tag_names, false)
20
+ def feature=(feature)
21
+ @feature = feature
22
+ @background.feature = feature if @background
19
23
  end
20
24
 
21
- def matches_scenario_names?(scenario_names)
22
- scenario_names.detect{|name| @name == name}
25
+ def descend?(visitor)
26
+ visitor.matches_lines?(self) &&
27
+ visitor.included_by_tags?(self) &&
28
+ !visitor.excluded_by_tags?(self) &&
29
+ visitor.matches_scenario_names?(self)
23
30
  end
24
31
 
25
32
  def accept(visitor)
26
- visitor.visit_background(@background) if @background
27
33
  visitor.visit_comment(@comment)
28
34
  visitor.visit_tags(@tags)
29
- visitor.visit_scenario_name(@keyword, @name, file_line(@line), source_indent(text_length))
30
- visitor.visit_steps(@steps_helper)
31
-
32
- @feature.scenario_executed(self) if @feature && !@executed
33
- @executed = true
34
- end
35
+ visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(text_length))
35
36
 
36
- def accept_steps(visitor)
37
- prior_world = @background ? @background.world : nil
38
- visitor.world(self, prior_world) do |world|
39
- previous = @background ? @background.status : :passed
40
- @steps.each do |step|
41
- step.previous = previous
42
- step.world = world
43
- visitor.visit_step(step)
44
- previous = step.status
45
- end
37
+ skip = @background && @background.failed?
38
+ skip_invoke! if skip
39
+ visitor.step_mother.before_and_after(self, skip) do
40
+ visitor.visit_steps(@steps)
46
41
  end
47
42
  end
48
43
 
49
- def source_indent(text_length)
50
- max_line_length - text_length
51
- end
52
-
53
- def max_line_length
54
- lengths = (@steps + [self]).map{|e| e.text_length}
55
- lengths.max
56
- end
57
-
58
- def text_length
59
- @keyword.jlength + @name.jlength
60
- end
61
-
62
- def at_lines?(lines)
63
- at_header_or_step_lines?(lines)
64
- end
65
-
66
- def at_header_or_step_lines?(lines)
67
- lines.empty? || lines.index(@line) || @steps.detect {|step| step.at_lines?(lines)} || @tags.at_lines?(lines)
68
- end
69
-
70
- def undefined?
71
- @steps.empty?
72
- end
73
-
74
- def step_executed(step)
75
- @feature.step_executed(step) if @feature
76
- end
77
-
78
- def backtrace_line(name = "#{@keyword} #{@name}", line = @line)
79
- @feature.backtrace_line(name, line) if @feature
80
- end
81
-
82
- def file_line(line = @line)
83
- @feature.file_line(line) if @feature
84
- end
85
-
86
- def previous_step(step)
87
- i = @steps.index(step) || -1
88
- @steps[i-1]
44
+ def skip_invoke!
45
+ @steps.each{|step_invocation| step_invocation.skip_invoke!}
46
+ @feature.next_feature_element(self) do |next_one|
47
+ next_one.skip_invoke!
48
+ end
89
49
  end
90
50
 
91
51
  def to_sexp
@@ -94,10 +54,11 @@ module Cucumber
94
54
  sexp += [comment] if comment
95
55
  tags = @tags.to_sexp
96
56
  sexp += tags if tags.any?
97
- steps = @steps.map{|step| step.to_sexp}
57
+ steps = @steps.to_sexp
98
58
  sexp += steps if steps.any?
99
59
  sexp
100
60
  end
61
+
101
62
  end
102
63
  end
103
64
  end
@@ -1,15 +1,18 @@
1
1
  module Cucumber
2
2
  module Ast
3
- class ScenarioOutline < Scenario
3
+ class ScenarioOutline
4
+ include FeatureElement
5
+
4
6
  # The +example_sections+ argument must be an Array where each element is another array representing
5
7
  # an Examples section. This array has 3 elements:
6
8
  #
7
9
  # * Examples keyword
8
10
  # * Examples section name
9
11
  # * Raw matrix
10
- def initialize(comment, tags, line, keyword, name, steps, example_sections)
11
- super(comment, tags, line, keyword, name, steps)
12
- steps.each {|step| step.status = :outline}
12
+ def initialize(background, comment, tags, line, keyword, name, steps, example_sections)
13
+ @background, @comment, @tags, @line, @keyword, @name = background, comment, tags, line, keyword, name
14
+ attach_steps(steps)
15
+ @steps = StepCollection.new(steps)
13
16
 
14
17
  @examples_array = example_sections.map do |example_section|
15
18
  examples_line = example_section[0]
@@ -22,59 +25,54 @@ module Cucumber
22
25
  end
23
26
  end
24
27
 
25
- def at_lines?(lines)
26
- super || @examples_array.detect { |examples| examples.at_lines?(lines) }
28
+ def feature=(feature)
29
+ @feature = feature
30
+ @background.feature = feature if @background
31
+ end
32
+
33
+ def descend?(visitor)
34
+ @examples_array.detect { |examples| examples.descend?(visitor) }
35
+ end
36
+
37
+ def matches_tags_and_name?(visitor)
38
+ visitor.included_by_tags?(self) &&
39
+ !visitor.excluded_by_tags?(self) &&
40
+ visitor.matches_scenario_names?(self)
27
41
  end
28
42
 
29
43
  def accept(visitor)
30
- visitor.visit_background(@background) if @background
31
44
  visitor.visit_comment(@comment)
32
45
  visitor.visit_tags(@tags)
33
- visitor.visit_scenario_name(@keyword, @name, file_line(@line), source_indent(text_length))
34
- visitor.visit_steps(@steps_helper)
46
+ visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(text_length))
47
+ visitor.visit_steps(@steps)
35
48
 
49
+ skip_invoke! if @background && @background.failed?
36
50
  @examples_array.each do |examples|
37
- visitor.visit_examples(examples)
51
+ visitor.visit_examples(examples) if examples.descend?(visitor)
38
52
  end
39
53
  end
40
54
 
41
- def each_example_row(&proc)
42
- @examples_array.each do |examples|
43
- examples.each_example_row(&proc)
55
+ def skip_invoke!
56
+ @examples_array.each{|examples| examples.skip_invoke!}
57
+ @feature.next_feature_element(self) do |next_one|
58
+ next_one.skip_invoke!
44
59
  end
45
60
  end
46
61
 
47
- def execute_row(cells, visitor, &proc)
48
- exception = nil
49
-
50
- prior_world = @background ? @background.world : nil
51
- visitor.world(self, prior_world) do |world|
52
-
53
- previous_status = @background ? @background.status : :passed
54
- argument_hash = cells.to_hash
55
- cell_index = 0
56
- @steps.each do |step|
57
- executed_step, previous_status, matched_args =
58
- step.execute_with_arguments(argument_hash, world, previous_status, visitor, cells[0].line)
59
- # There might be steps that don't have any arguments
60
- # If there are no matched args, we'll still iterate once
61
- matched_args = [nil] if matched_args.empty?
62
-
63
- matched_args.each do
64
- cell = cells[cell_index]
65
- if cell
66
- proc.call(cell, previous_status)
67
- cell_index += 1
68
- end
69
- end
70
- exception ||= executed_step.exception
71
- end
62
+ def step_invocations(cells)
63
+ step_invocations = @steps.step_invocations_from_cells(cells)
64
+ if @background
65
+ @background.step_collection(step_invocations)
66
+ else
67
+ StepCollection.new(step_invocations)
72
68
  end
73
- @feature.scenario_executed(self) if @feature
74
- exception
75
69
  end
76
70
 
77
- def pending? ; false ; end
71
+ def each_example_row(&proc)
72
+ @examples_array.each do |examples|
73
+ examples.each_example_row(&proc)
74
+ end
75
+ end
78
76
 
79
77
  def to_sexp
80
78
  sexp = [:scenario_outline, @keyword, @name]
@@ -82,7 +80,7 @@ module Cucumber
82
80
  sexp += [comment] if comment
83
81
  tags = @tags.to_sexp
84
82
  sexp += tags if tags.any?
85
- steps = @steps.map{|step| step.to_sexp}
83
+ steps = @steps.to_sexp
86
84
  sexp += steps if steps.any?
87
85
  sexp += @examples_array.map{|e| e.to_sexp}
88
86
  sexp