pretty_face 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -6,3 +6,5 @@ pkg/*
6
6
  *.swp
7
7
  fixture.html
8
8
  images
9
+ results
10
+ tmp
data/.travis.yml CHANGED
@@ -1,3 +1,5 @@
1
+ before_install: mkdir results
2
+
1
3
  language: ruby
2
4
  rvm:
3
5
  - 1.9.3
data/ChangeLog CHANGED
@@ -1,2 +1,9 @@
1
+ === Release 0.2
2
+ * Creating a page for each feature file
3
+ * Displaying Background
4
+ * Displaying Errors on feature pages
5
+ * Displaying multi-line steps
6
+ * Displaying embedded images
7
+
1
8
  === Release 0.1 / 2012-11-17
2
9
  Initial release with single page basic report
data/README.md CHANGED
@@ -1,6 +1,12 @@
1
1
  # pretty_face
2
2
 
3
- HTML report for cucumber and rspec. You can customzie the report by editing an erb file.
3
+ HTML report for cucumber and rspec. You can customize the report by editing an erb file.
4
+
5
+ The current release is very basic but you can expect a lot more over the next month or so. If you wish to use this formatter you can simply add the following to your command-line or cucumber.yml profile:
6
+
7
+ --format PrettyFace::Formatter::Html --out index.html
8
+
9
+
4
10
 
5
11
  ## Known Issues
6
12
 
@@ -18,4 +24,4 @@ See [http://github.com/cheezy/pretty_face/issues](http://github.com/cheezy/prett
18
24
 
19
25
  ## Copyright
20
26
 
21
- Copyright (c) 2012 Jeffrey S. Morgan. See LICENSE for details.
27
+ Copyright (c) 2012-2013 Jeffrey S. Morgan. See LICENSE for details.
data/Rakefile CHANGED
@@ -6,6 +6,7 @@ require 'rspec/core/rake_task'
6
6
  Cucumber::Rake::Task.new(:features, "Run all features") do |t|
7
7
  t.profile = 'default'
8
8
  end
9
+
9
10
  RSpec::Core::RakeTask.new(:spec) do |spec|
10
11
  spec.ruby_opts = "-I lib:spec"
11
12
  spec.pattern = 'spec/**/*_spec.rb'
data/autotrader.png ADDED
Binary file
data/cucumber.yml CHANGED
@@ -1,3 +1,3 @@
1
1
  default: --color --no-source --format pretty
2
- fixture: --color --no-source --require fixtures/step_definitions --format PrettyFace::Formatter::Html --out fixture.html
2
+ fixture: --color --no-source --require fixtures/step_definitions --format PrettyFace::Formatter::Html --out results/fixture.html
3
3
  focus: --color --no-source --format pretty --tags @focus
@@ -0,0 +1,94 @@
1
+ Feature: pages that show details for features
2
+
3
+ Background:
4
+ When I run `cucumber fixtures --profile fixture`
5
+
6
+ Scenario: Generate the pages
7
+ Then the following files should exist:
8
+ | results/basic.html |
9
+ | results/advanced.html |
10
+
11
+ Scenario: Generating the basic html page from the erb
12
+ Then the file "results/basic.html" should contain "DOCTYPE html PUBLIC"
13
+ And the file "results/basic.html" should contain "<html xmlns='http://www.w3.org/1999/xhtml'>"
14
+ And the file "results/basic.html" should contain "<head>"
15
+ And the file "results/basic.html" should contain "<body"
16
+ And the file "results/basic.html" should contain "<title>Feature Results</title>"
17
+
18
+ Scenario: Including an image / logo
19
+ Then the file "results/basic.html" should contain "<img src="
20
+ And the file "results/basic.html" should contain "images/face.jpg"
21
+
22
+ Scenario: It should show start time and duration in the header
23
+ Then the file "results/basic.html" should contain "Feature started:"
24
+ And the file "results/basic.html" should contain "Duration:"
25
+
26
+ Scenario: Generating some basic stats from the erb
27
+ Then the file "results/basic.html" should contain "<th>Executed<"
28
+ And the file "results/basic.html" should contain "<th>Average<br/>Duration"
29
+ And the file "results/basic.html" should contain "Scenarios"
30
+ And the file "results/basic.html" should contain "Steps"
31
+
32
+ Scenario: It should capture scenario and step statuses
33
+ Then the file "results/basic.html" should contain "Passed"
34
+ And the file "results/basic.html" should contain "Failed"
35
+ And the file "results/basic.html" should contain "Pending"
36
+ And the file "results/basic.html" should contain "Undefined"
37
+ And the file "results/basic.html" should contain "Skipped"
38
+
39
+ Scenario: It should display scenario names
40
+ Then the file "results/basic.html" should contain "A passing scenario"
41
+ And the file "results/advanced.html" should contain "A scenario outline"
42
+ And the file "results/background.html" should contain "Another passing scenario"
43
+
44
+ Scenario: It should display scenario steps
45
+ Then the file "results/basic.html" should contain "it should say hello"
46
+ And the file "results/background.html" should contain "it should say hello"
47
+ And the file "results/advanced.html" should contain "I am using a scenario outline"
48
+
49
+ Scenario: It should display the step and data for scenario outline steps
50
+ I use &#x27;aaa&#x27;\
51
+ Then the file "results/advanced.html" should contain "I use &#x27;aaa&#x27;"
52
+ And the file "results/advanced.html" should contain "I use &#x27;bbb&#x27;"
53
+
54
+ Scenario: It should display descriptions for features
55
+ Then the file "results/basic.html" should contain "As a stakeholder"
56
+ Then the file "results/basic.html" should contain "I want to see some details about this feature"
57
+ Then the file "results/basic.html" should contain "So that I have some idea why this test matters"
58
+
59
+ Scenario: It should display a nested table
60
+ Then the file "results/advanced.html" should contain "<th>key1</th>"
61
+ And the file "results/advanced.html" should contain "<th>key2</th>"
62
+ And the file "results/advanced.html" should contain "<th>key3</th>"
63
+ And the file "results/advanced.html" should contain "<td>value1</td>"
64
+ And the file "results/advanced.html" should contain "<td>value2</td>"
65
+ And the file "results/advanced.html" should contain "<td>value3</td>"
66
+
67
+ Scenario: It should display the multi-line argument
68
+ Then the file "results/advanced.html" should contain "Hello with"
69
+ And the file "results/advanced.html" should contain "more than one"
70
+ And the file "results/advanced.html" should contain "line in a string"
71
+
72
+ Scenario: It should display errors for features
73
+ Then the file "results/basic.html" should contain "RSpec::Expectations::ExpectationNotMetError"
74
+ Then the file "results/advanced.html" should contain "RSpec::Expectations::ExpectationNotMetError"
75
+ Then the file "results/failing_background.html" should contain "RSpec::Expectations::ExpectationNotMetError"
76
+
77
+ Scenario: Embedding an image into the page
78
+ Then the file "results/basic.html" should contain "<img id='img_0' style='display: none' src='images/autotrader.png'/>"
79
+ And the file "results/basic.html" should contain "<a href='' onclick="
80
+ And the file "results/basic.html" should contain "img=document.getElementById('img_0'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false"
81
+ And the file "results/basic.html" should contain ">AutoTrader</a>"
82
+
83
+ Scenario: Displaying a background
84
+ Then the file "results/background.html" should contain "Background: A scenario can have a background"
85
+ And the file "results/background.html" should contain "When Cucumber puts"
86
+
87
+ Scenario: Feature pages should have a link back to the report summary
88
+ Then the file "results/advanced.html" should contain "<a href="
89
+
90
+ Scenario: Should create directories when directories exist in features directory
91
+ Then the following files should exist:
92
+ | results/more/more.html |
93
+
94
+
@@ -5,59 +5,65 @@ Feature: pretty face report
5
5
 
6
6
  Scenario: Cucumber crefates an html report
7
7
  Then the following files should exist:
8
- | fixture.html |
8
+ | results/fixture.html |
9
9
 
10
10
  Scenario: Generating the basic html page from the erb
11
- Then the file "fixture.html" should contain "DOCTYPE html PUBLIC"
12
- And the file "fixture.html" should contain "<html xmlns='http://www.w3.org/1999/xhtml'>"
13
- And the file "fixture.html" should contain "<head>"
14
- And the file "fixture.html" should contain "<body"
15
- And the file "fixture.html" should contain "<title>Test Results</title>"
11
+ Then the file "results/fixture.html" should contain "DOCTYPE html PUBLIC"
12
+ And the file "results/fixture.html" should contain "<html xmlns='http://www.w3.org/1999/xhtml'>"
13
+ And the file "results/fixture.html" should contain "<head>"
14
+ And the file "results/fixture.html" should contain "<body"
15
+ And the file "results/fixture.html" should contain "<title>Test Results</title>"
16
16
 
17
17
  Scenario: Generating some basic stats from the erb
18
- Then the file "fixture.html" should contain "<th>Executed<"
19
- And the file "fixture.html" should contain "<th>Average<br/>Duration"
20
- And the file "fixture.html" should contain "Scenarios"
21
- And the file "fixture.html" should contain "Steps"
18
+ Then the file "results/fixture.html" should contain "<th>Executed<"
19
+ And the file "results/fixture.html" should contain "<th>Average<br/>Duration"
20
+ And the file "results/fixture.html" should contain "Scenarios"
21
+ And the file "results/fixture.html" should contain "Steps"
22
22
 
23
23
  Scenario: Including the styles for the main page
24
- Then the file "fixture.html" should contain "<style type='text/css'>"
25
- And the file "fixture.html" should contain "</style>"
24
+ Then the file "results/fixture.html" should contain "<link href='stylesheets/style.css' type='text/css' rel='stylesheet' />"
25
+ And the file "results/fixture.html" should not contain "</style>"
26
26
 
27
27
  Scenario: Including an image / logo
28
- Then the file "fixture.html" should contain "<img src="
29
- And the file "fixture.html" should contain "images/face.jpg"
28
+ Then the file "results/fixture.html" should contain "<img src="
29
+ And the file "results/fixture.html" should contain "images/face.jpg"
30
+
31
+ Scenario: It should copy the style sheet to the stylesheets directory
32
+ Then the following files should exist:
33
+ | results/stylesheets/style.css |
30
34
 
31
35
  Scenario: It should copy the logo image to the images directory
32
36
  Then the following files should exist:
33
- | images/face.jpg |
37
+ | results/images/face.jpg |
34
38
 
35
39
  Scenario: It should show start time and duration in the header
36
- Then the file "fixture.html" should contain "Tests started:"
37
- And the file "fixture.html" should contain "Duration:"
40
+ Then the file "results/fixture.html" should contain "Tests started:"
41
+ And the file "results/fixture.html" should contain "Duration:"
38
42
 
39
43
  Scenario: It should capture scenario and step statuses
40
- Then the file "fixture.html" should contain "Passed"
41
- And the file "fixture.html" should contain "Failed"
42
- And the file "fixture.html" should contain "Pending"
43
- And the file "fixture.html" should contain "Undefined"
44
- And the file "fixture.html" should contain "Skipped"
44
+ Then the file "results/fixture.html" should contain "Passed"
45
+ And the file "results/fixture.html" should contain "Failed"
46
+ And the file "results/fixture.html" should contain "Pending"
47
+ And the file "results/fixture.html" should contain "Undefined"
48
+ And the file "results/fixture.html" should contain "Skipped"
45
49
 
46
50
  Scenario: It should display all of the tests with failures
47
- Then the file "fixture.html" should contain "Tests With Failures:"
51
+ Then the file "results/fixture.html" should contain "Tests With Failures:"
48
52
 
49
53
  Scenario: It should display a list of all features / scenarios
50
- Then the file "fixture.html" should contain "Scenario Overview:"
54
+ Then the file "results/fixture.html" should contain "Feature Overview:"
51
55
 
52
56
  Scenario: It should display useful information about each scenario
53
- Then the file "fixture.html" should contain "Result"
54
- And the file "fixture.html" should contain "Name"
55
- And the file "fixture.html" should contain "# Steps"
56
- And the file "fixture.html" should contain "Duration"
57
+ Then the file "results/fixture.html" should contain "Feature"
58
+ And the file "results/fixture.html" should contain "File"
59
+ And the file "results/fixture.html" should contain "Passed"
60
+ And the file "results/fixture.html" should contain "Failed"
61
+ And the file "results/fixture.html" should contain "Pending"
62
+ And the file "results/fixture.html" should contain "Undefined"
63
+ And the file "results/fixture.html" should contain "Skipped"
57
64
 
58
65
  Scenario: It should display the data from scenario outlines
59
- Then the file "fixture.html" should contain "| aaa | bbb |"
60
- And the file "fixture.html" should contain "| ccc | ddd |"
66
+ Then the file "results/fixture.html" should contain "| aaa | bbb |"
67
+ And the file "results/fixture.html" should contain "| ccc | ddd |"
61
68
 
62
- Scenario: It should display the scenario name for scenario outlines
63
- Then the file "fixture.html" should contain "A scenario outline"
69
+
@@ -1,5 +1,10 @@
1
1
  require 'fileutils'
2
2
 
3
+ Before do
4
+ @aruba_timeout_seconds = 60
5
+ FileUtils.mkdir('results') unless File.exists? 'results'
6
+ end
7
+
3
8
  After do
4
9
  file = File.join(File.dirname(__FILE__), '..', '..', 'fixture.html')
5
10
  # FileUtils.rm file
@@ -11,4 +11,47 @@ Feature: Advanced scenarios
11
11
  | aaa | bbb |
12
12
  | ccc | ddd |
13
13
  | eee | fff |
14
+
15
+ Scenario: Nested table in a step
16
+ When I have a nested table step like this:
17
+ | key1 | key2 | key3 |
18
+ | value1 | value2 | value3 |
19
+ Then the table should be displayed in the results
14
20
 
21
+ Scenario: A scenario with muti-line arguments
22
+ When Cucumber puts
23
+ """
24
+ Hello with
25
+ more than one
26
+ line in a string
27
+ """
28
+ Then it should say
29
+ """
30
+ Hello with
31
+ more than one
32
+ line in a string
33
+ """
34
+
35
+ Scenario Outline: Fails during examples
36
+ Given I am using a scenario outline
37
+ When I fail with <first>
38
+ Then I use <second>
39
+ Then the examples should not work
40
+
41
+ Examples:
42
+ | first | second |
43
+ | aaa | bbb |
44
+ | ccc | ddd |
45
+ | eee | fff |
46
+
47
+ Scenario Outline: Fails before examples
48
+ Given the first step fails
49
+ When I use <first>
50
+ And I use <second>
51
+ Then the examples should not work
52
+
53
+ Examples:
54
+ | first | second |
55
+ | aaa | bbb |
56
+ | ccc | ddd |
57
+ | eee | fff |
@@ -0,0 +1,10 @@
1
+ Feature: Background for scenarios
2
+
3
+ Background: A scenario can have a background
4
+ When Cucumber puts "hello" in a background
5
+
6
+ Scenario: A passing scenario
7
+ Then it should say hello
8
+
9
+ Scenario: Another passing scenario
10
+ Then it should say hello
@@ -1,4 +1,7 @@
1
1
  Feature: Basic scenarios
2
+ As a stakeholder
3
+ I want to see some details about this feature
4
+ So that I have some idea why this test matters
2
5
 
3
6
  Scenario: A passing scenario
4
7
  When Cucumber puts "hello"
@@ -0,0 +1,7 @@
1
+ Feature: Failing Background for scenarios
2
+
3
+ Background: A scenario can have a failing background
4
+ Given the first step fails
5
+
6
+ Scenario: A scenario with failing background
7
+ Then the second step should not execute
@@ -0,0 +1,8 @@
1
+ Feature: More scenarios
2
+ As a stakeholder
3
+ I want to see some details about this feature
4
+ So that I have some idea why this test matters
5
+
6
+ Scenario: A passing scenario with more
7
+ When Cucumber puts "hello"
8
+ Then it should say hello
@@ -1,12 +1,34 @@
1
1
  Given /^I am using a scenario outline$/ do
2
-
2
+
3
3
  end
4
4
 
5
5
  When /^I use (.*?)$/ do |value|
6
6
 
7
7
  end
8
8
 
9
- Then /^the examples should work$/ do
9
+ When /^I fail with (.*?)$/ do |value|
10
+ true.should == false
11
+ end
12
+
13
+
14
+ Then /^the examples should(?: not)? work$/ do
15
+ sleep 1
16
+ end
17
+
18
+ When /^I have a nested table step like this:$/ do |table|
10
19
 
11
20
  end
12
21
 
22
+ Then /^the table should be displayed in the results$/ do
23
+
24
+ end
25
+
26
+ When /^Cucumber puts$/ do |some_string|
27
+ puts some_string
28
+ @last_string = some_string
29
+ sleep 1
30
+ end
31
+
32
+ Then /^it should say$/ do |some_string|
33
+ @last_string.should == some_string
34
+ end
@@ -1,5 +1,11 @@
1
1
  When /^Cucumber puts "(.*?)"$/ do |some_string|
2
2
  puts some_string
3
+ embed('autotrader.png', 'image/png', 'AutoTrader')
4
+ sleep 1
5
+ end
6
+
7
+ When /^Cucumber puts "(.*?)" in a background$/ do |some_string|
8
+ puts some_string
3
9
  end
4
10
 
5
11
  Then /^it should say hello$/ do
@@ -1,4 +1,4 @@
1
- require 'erb'
1
+ require 'action_view'
2
2
  require 'fileutils'
3
3
  require 'cucumber/formatter/io'
4
4
  require 'cucumber/formatter/duration'
@@ -16,31 +16,61 @@ module PrettyFace
16
16
  include Cucumber::Formatter::Duration
17
17
  include ViewHelper
18
18
 
19
+ attr_reader :report
20
+
19
21
  def initialize(step_mother, path_or_io, options)
20
22
  @path = path_or_io
21
23
  @io = ensure_io(path_or_io, 'html')
24
+ @path_to_erb = File.join(File.dirname(__FILE__), '..', 'templates')
22
25
  @step_mother = step_mother
23
26
  @options = options
24
27
  @report = Report.new
25
- @step_times = []
26
- @scenario_times = []
27
- @outline_steps = []
28
+ @img_id = 0
29
+ end
30
+
31
+ def embed(src, mime_type, label)
32
+ case(mime_type)
33
+ when /^image\/(png|gif|jpg|jpeg)/
34
+ embed_image(src, label)
35
+ end
36
+ end
37
+
38
+ def embed_image(src, label)
39
+ @report.current_scenario.image = src.split('/').last
40
+ @report.current_scenario.image_label = label
41
+ @report.current_scenario.image_id = "img_#{@img_id}"
42
+ @img_id += 1
43
+ FileUtils.cp src, "#{File.dirname(@path)}/images"
28
44
  end
29
45
 
30
46
  def before_features(features)
47
+ make_output_directories
31
48
  @tests_started = Time.now
32
49
  end
33
50
 
51
+ def features_summary_file
52
+ parts = @io.path.split('/')
53
+ parts[parts.length - 1]
54
+ end
55
+
34
56
  def before_feature(feature)
35
- @report.add_feature ReportFeature.new(feature)
57
+ @report.add_feature ReportFeature.new(feature, features_summary_file)
36
58
  end
37
59
 
38
60
  def after_feature(feature)
39
- @report.current_feature.title = feature.title
61
+ @report.current_feature.close(feature)
62
+ end
63
+
64
+ def before_background(background)
65
+ @report.begin_background
66
+ end
67
+
68
+ def after_background(background)
69
+ @report.end_background
70
+ @report.current_feature.background << ReportStep.new(background)
40
71
  end
41
72
 
42
73
  def before_feature_element(feature_element)
43
- @scenario_timer = Time.now
44
74
  unless scenario_outline? feature_element
45
75
  @report.add_scenario ReportScenario.new(feature_element)
46
76
  end
@@ -52,12 +82,16 @@ module PrettyFace
52
82
  end
53
83
  end
54
84
 
55
- def after_outline_table(outline_table)
56
- process_scenario_outline(outline_table)
85
+ def before_table_row(example_row)
86
+ @report.add_scenario ReportScenario.new(example_row) unless info_row?(example_row)
57
87
  end
58
88
 
59
89
  def after_table_row(example_row)
60
- @scenario_times.push Time.now - @scenario_timer
90
+ unless info_row?(example_row)
91
+ @report.current_scenario.populate(example_row)
92
+ build_scenario_outline_steps(example_row)
93
+ end
94
+ populate_cells(example_row) if example_row.instance_of? Cucumber::Ast::Table::Cells
61
95
  end
62
96
 
63
97
  def before_step(step)
@@ -65,7 +99,11 @@ module PrettyFace
65
99
  end
66
100
 
67
101
  def after_step(step)
68
- process_step(step)
102
+ step = process_step(step) unless step_belongs_to_outline? step
103
+ if @cells
104
+ step.table = @cells
105
+ @cells = nil
106
+ end
69
107
  end
70
108
 
71
109
  def after_features(features)
@@ -73,6 +111,7 @@ module PrettyFace
73
111
  @duration = format_duration(Time.now - @tests_started)
74
112
  generate_report
75
113
  copy_images_directory
114
+ copy_stylesheets_directory
76
115
  end
77
116
 
78
117
  def features
@@ -82,58 +121,104 @@ module PrettyFace
82
121
  private
83
122
 
84
123
  def generate_report
85
- filename = File.join(File.dirname(__FILE__), '..', 'templates', 'main.erb')
86
- text = File.new(filename).read
87
- @io.puts ERB.new(text, nil, "%").result(binding)
124
+ renderer = ActionView::Base.new(@path_to_erb)
125
+ filename = File.join(@path_to_erb, 'main')
126
+ @io.puts renderer.render(:file => filename, :locals => {:report => self})
127
+ features.each do |feature|
128
+ write_feature_file(feature)
129
+ end
88
130
  end
89
131
 
90
- def copy_images_directory
91
- path = "#{File.dirname(@path)}/images"
132
+ def write_feature_file(feature)
133
+ renderer = ActionView::Base.new(@path_to_erb)
134
+ filename = File.join(@path_to_erb, 'feature')
135
+ output_file = "#{File.dirname(@path)}/#{feature.file}"
136
+ to_cut = output_file.split('/').last
137
+ directory = output_file.sub("/#{to_cut}", '')
138
+ FileUtils.mkdir directory unless File.directory? directory
139
+ file = File.new(output_file, Cucumber.file_mode('w'))
140
+ file.puts renderer.render(:file => filename, :locals => {:feature => feature})
141
+ file.flush
142
+ file.close
143
+ end
144
+
145
+ def make_output_directories
146
+ make_directory 'images'
147
+ make_directory 'stylesheets'
148
+ end
149
+
150
+ def make_directory(dir)
151
+ path = "#{File.dirname(@path)}/#{dir}"
92
152
  FileUtils.mkdir path unless File.directory? path
93
- %w(face failed passed pending undefined skipped).each do |file|
94
- FileUtils.cp File.join(File.dirname(__FILE__), '..', 'templates', "#{file}.jpg"), path
153
+ end
154
+
155
+ def copy_directory(dir, file_names, file_extension)
156
+ path = "#{File.dirname(@path)}/#{dir}"
157
+ file_names.each do |file|
158
+ FileUtils.cp File.join(File.dirname(__FILE__), '..', 'templates', "#{file}.#{file_extension}"), path
95
159
  end
96
160
  end
97
161
 
98
- def process_scenario(scenario)
99
- @scenario_times.push Time.now - @scenario_timer
100
- @report.current_scenario.populate(scenario)
162
+ def copy_images_directory
163
+ copy_directory 'images', ['face'], 'jpg'
164
+ copy_directory 'images', %w(failed passed pending undefined skipped), "png"
101
165
  end
102
166
 
103
- def process_example_row(example_row)
104
- @report.add_scenario build_scenario_outline_with example_row
167
+ def copy_stylesheets_directory
168
+ copy_directory 'stylesheets', ['style'], 'css'
105
169
  end
106
170
 
107
- def process_scenario_outline(scenario_outline)
108
- scenario_outline.example_rows.each do |example_row|
109
- process_example_row(example_row)
110
- end
111
- @outline_steps = []
171
+ def process_scenario(scenario)
172
+ @report.current_scenario.populate(scenario)
112
173
  end
113
174
 
114
- def process_step(step)
115
- @step_times.push Time.now - @step_timer
116
- if step_belongs_to_outline? step
117
- @outline_steps << ReportStep.new(step)
175
+ def process_step(step, status=nil)
176
+ duration = Time.now - @step_timer
177
+ report_step = ReportStep.new(step)
178
+ report_step.duration = duration
179
+ report_step.status = status unless status.nil?
180
+ if step.background?
181
+ @report.current_feature.background << report_step if @report.processing_background_steps?
118
182
  else
119
- @report.add_step ReportStep.new(step)
183
+ @report.add_step report_step
120
184
  end
185
+ report_step
121
186
  end
122
187
 
123
188
  def scenario_outline?(feature_element)
124
189
  feature_element.is_a? Cucumber::Ast::ScenarioOutline
125
190
  end
126
191
 
192
+ def info_row?(example_row)
193
+ return example_row.scenario_outline.nil? if example_row.respond_to? :scenario_outline
194
+ return true if example_row.instance_of? Cucumber::Ast::Table::Cells
195
+ false
196
+ end
197
+
127
198
  def step_belongs_to_outline?(step)
128
199
  scenario = step.instance_variable_get "@feature_element"
129
200
  not scenario.nil?
130
201
  end
131
202
 
132
- def build_scenario_outline_with(example_row)
133
- scenario = ReportScenario.new(example_row)
134
- scenario.steps = @outline_steps
135
- scenario.populate example_row
136
- scenario
203
+ def build_scenario_outline_steps(example_row)
204
+ si = example_row.instance_variable_get :@step_invocations
205
+ si.each do |row|
206
+ process_step(row, row.status)
207
+ end
208
+ end
209
+
210
+ def step_error(exception, step)
211
+ return nil if exception.nil?
212
+ exception.backtrace[-1] =~ /^#{step.file_colon_line}/ ? exception : nil
213
+ end
214
+
215
+ def populate_cells(example_row)
216
+ @cells ||= []
217
+ values = []
218
+ example_row.to_a.each do |cell|
219
+ values << cell.value
220
+ end
221
+ @cells << values
137
222
  end
138
223
  end
139
224
  end