cucumber 1.2.1 → 1.2.2

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 (172) hide show
  1. data/.rvmrc +1 -1
  2. data/.travis.yml +3 -2
  3. data/DEVELOPERS.md +48 -0
  4. data/History.md +22 -3
  5. data/README.md +13 -31
  6. data/Rakefile +1 -0
  7. data/cucumber.gemspec +18 -17
  8. data/cucumber.yml +3 -2
  9. data/examples/i18n/cs/Rakefile +6 -0
  10. data/examples/i18n/cs/features/addition.feature +17 -0
  11. data/examples/i18n/cs/features/division.feature +11 -0
  12. data/examples/i18n/cs/features/step_definitons/calculator_steps.rb +24 -0
  13. data/examples/i18n/cs/lib/calculator.rb +14 -0
  14. data/examples/i18n/hi/Rakefile +6 -0
  15. data/examples/i18n/hi/features/addition.feature +16 -0
  16. data/examples/i18n/hi/features/division.feature +10 -0
  17. data/examples/i18n/hi/features/step_definitons/calculator_steps.rb +24 -0
  18. data/examples/i18n/hi/lib/calculator.rb +15 -0
  19. data/examples/python/README.textile +2 -1
  20. data/examples/ruby2python/README.textile +2 -1
  21. data/features/.cucumber/stepdefs.json +1688 -445
  22. data/features/assertions.feature +69 -0
  23. data/features/formatter_callbacks.feature +189 -0
  24. data/features/html_formatter.feature +19 -0
  25. data/features/json_formatter.feature +8 -4
  26. data/features/nested_steps_with_second_arg.feature +73 -0
  27. data/features/step_definitions.feature +65 -0
  28. data/features/step_definitions/cucumber_steps.rb +18 -3
  29. data/fixtures/self_test/features/support/env.rb +1 -1
  30. data/gem_tasks/cucumber.rake +5 -3
  31. data/gem_tasks/downloads.rb +3 -3
  32. data/gem_tasks/stats +4 -2
  33. data/gem_tasks/yard.rake +31 -13
  34. data/legacy_features/default_snippets.feature +3 -3
  35. data/legacy_features/language_help.feature +4 -0
  36. data/legacy_features/report_called_undefined_steps.feature +1 -1
  37. data/legacy_features/snippet.feature +3 -3
  38. data/legacy_features/snippets_when_using_star_keyword.feature +1 -1
  39. data/legacy_features/step_definitions/cucumber_steps.rb +4 -3
  40. data/legacy_features/support/env.rb +1 -1
  41. data/legacy_features/support/fake_wire_server.rb +9 -9
  42. data/lib/autotest/cucumber_mixin.rb +14 -14
  43. data/lib/autotest/discover.rb +2 -0
  44. data/lib/cucumber.rb +2 -2
  45. data/lib/cucumber/ast.rb +1 -1
  46. data/lib/cucumber/ast/background.rb +11 -7
  47. data/lib/cucumber/ast/comment.rb +2 -2
  48. data/lib/cucumber/ast/doc_string.rb +1 -1
  49. data/lib/cucumber/ast/examples.rb +1 -1
  50. data/lib/cucumber/ast/feature.rb +2 -2
  51. data/lib/cucumber/ast/feature_element.rb +1 -1
  52. data/lib/cucumber/ast/multiline_argument.rb +2 -2
  53. data/lib/cucumber/ast/names.rb +2 -2
  54. data/lib/cucumber/ast/outline_table.rb +4 -5
  55. data/lib/cucumber/ast/scenario.rb +14 -14
  56. data/lib/cucumber/ast/scenario_outline.rb +4 -4
  57. data/lib/cucumber/ast/step.rb +3 -3
  58. data/lib/cucumber/ast/step_collection.rb +5 -5
  59. data/lib/cucumber/ast/step_invocation.rb +8 -8
  60. data/lib/cucumber/ast/table.rb +40 -27
  61. data/lib/cucumber/ast/tree_walker.rb +9 -8
  62. data/lib/cucumber/ast/visitor.rb +1 -1
  63. data/lib/cucumber/cli/configuration.rb +10 -10
  64. data/lib/cucumber/cli/drb_client.rb +1 -1
  65. data/lib/cucumber/cli/main.rb +3 -3
  66. data/lib/cucumber/cli/options.rb +3 -2
  67. data/lib/cucumber/cli/profile_loader.rb +1 -1
  68. data/lib/cucumber/configuration.rb +12 -12
  69. data/lib/cucumber/constantize.rb +11 -2
  70. data/lib/cucumber/core_ext/disable_mini_and_test_unit_autorun.rb +1 -1
  71. data/lib/cucumber/core_ext/instance_exec.rb +4 -4
  72. data/lib/cucumber/core_ext/proc.rb +3 -3
  73. data/lib/cucumber/errors.rb +1 -1
  74. data/lib/cucumber/feature_file.rb +1 -1
  75. data/lib/cucumber/formatter/ansicolor.rb +36 -23
  76. data/lib/cucumber/formatter/console.rb +45 -25
  77. data/lib/cucumber/formatter/debug.rb +7 -7
  78. data/lib/cucumber/formatter/duration.rb +1 -1
  79. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +7 -0
  80. data/lib/cucumber/formatter/gpretty.rb +1 -1
  81. data/lib/cucumber/formatter/html.rb +52 -53
  82. data/lib/cucumber/formatter/interceptor.rb +2 -2
  83. data/lib/cucumber/formatter/json.rb +1 -1
  84. data/lib/cucumber/formatter/json_pretty.rb +2 -1
  85. data/lib/cucumber/formatter/junit.rb +1 -1
  86. data/lib/cucumber/formatter/ordered_xml_markup.rb +1 -1
  87. data/lib/cucumber/formatter/pretty.rb +12 -12
  88. data/lib/cucumber/formatter/progress.rb +5 -5
  89. data/lib/cucumber/formatter/rerun.rb +5 -5
  90. data/lib/cucumber/formatter/stepdefs.rb +1 -1
  91. data/lib/cucumber/formatter/steps.rb +6 -6
  92. data/lib/cucumber/formatter/summary.rb +6 -6
  93. data/lib/cucumber/formatter/unicode.rb +18 -18
  94. data/lib/cucumber/formatter/usage.rb +7 -7
  95. data/lib/cucumber/js_support/js_dsl.js +1 -1
  96. data/lib/cucumber/language_support.rb +1 -1
  97. data/lib/cucumber/parser/gherkin_builder.rb +33 -33
  98. data/lib/cucumber/platform.rb +3 -2
  99. data/lib/cucumber/py_support/py_dsl.py +2 -2
  100. data/lib/cucumber/py_support/py_language.py +2 -2
  101. data/lib/cucumber/py_support/py_language.rb +2 -2
  102. data/lib/cucumber/rake/task.rb +4 -3
  103. data/lib/cucumber/rb_support/rb_dsl.rb +10 -10
  104. data/lib/cucumber/rb_support/rb_language.rb +27 -19
  105. data/lib/cucumber/rb_support/rb_step_definition.rb +39 -11
  106. data/lib/cucumber/rb_support/rb_transform.rb +3 -3
  107. data/lib/cucumber/rb_support/rb_world.rb +15 -15
  108. data/lib/cucumber/rb_support/regexp_argument_matcher.rb +1 -1
  109. data/lib/cucumber/rspec/disable_option_parser.rb +1 -1
  110. data/lib/cucumber/rspec/doubles.rb +1 -1
  111. data/lib/cucumber/runtime.rb +11 -10
  112. data/lib/cucumber/runtime/features_loader.rb +6 -6
  113. data/lib/cucumber/runtime/for_programming_languages.rb +8 -15
  114. data/lib/cucumber/runtime/results.rb +6 -6
  115. data/lib/cucumber/runtime/support_code.rb +37 -28
  116. data/lib/cucumber/runtime/user_interface.rb +4 -4
  117. data/lib/cucumber/step_definition_light.rb +4 -4
  118. data/lib/cucumber/step_definitions.rb +2 -3
  119. data/lib/cucumber/step_match.rb +6 -6
  120. data/lib/cucumber/step_mother.rb +1 -1
  121. data/lib/cucumber/term/ansicolor.rb +22 -22
  122. data/lib/cucumber/wire_support/configuration.rb +11 -14
  123. data/lib/cucumber/wire_support/connection.rb +10 -9
  124. data/lib/cucumber/wire_support/request_handler.rb +3 -3
  125. data/lib/cucumber/wire_support/wire_exception.rb +3 -3
  126. data/lib/cucumber/wire_support/wire_language.rb +11 -11
  127. data/lib/cucumber/wire_support/wire_packet.rb +7 -5
  128. data/lib/cucumber/wire_support/wire_protocol.rb +6 -6
  129. data/lib/cucumber/wire_support/wire_protocol/requests.rb +20 -20
  130. data/lib/cucumber/wire_support/wire_step_definition.rb +4 -4
  131. data/spec/cucumber/ast/background_spec.rb +4 -4
  132. data/spec/cucumber/ast/doc_string_spec.rb +8 -8
  133. data/spec/cucumber/ast/feature_factory.rb +4 -4
  134. data/spec/cucumber/ast/feature_spec.rb +18 -18
  135. data/spec/cucumber/ast/outline_table_spec.rb +3 -3
  136. data/spec/cucumber/ast/step_spec.rb +4 -4
  137. data/spec/cucumber/ast/table_spec.rb +50 -29
  138. data/spec/cucumber/ast/tree_walker_spec.rb +12 -4
  139. data/spec/cucumber/broadcaster_spec.rb +1 -1
  140. data/spec/cucumber/cli/configuration_spec.rb +10 -4
  141. data/spec/cucumber/cli/drb_client_spec.rb +1 -1
  142. data/spec/cucumber/cli/main_spec.rb +28 -7
  143. data/spec/cucumber/cli/options_spec.rb +3 -3
  144. data/spec/cucumber/configuration_spec.rb +4 -4
  145. data/spec/cucumber/constantize_spec.rb +2 -0
  146. data/spec/cucumber/core_ext/proc_spec.rb +7 -7
  147. data/spec/cucumber/formatter/ansicolor_spec.rb +2 -2
  148. data/spec/cucumber/formatter/duration_spec.rb +2 -2
  149. data/spec/cucumber/formatter/html_spec.rb +31 -31
  150. data/spec/cucumber/formatter/interceptor_spec.rb +10 -0
  151. data/spec/cucumber/formatter/progress_spec.rb +1 -1
  152. data/spec/cucumber/formatter/spec_helper.rb +7 -7
  153. data/spec/cucumber/rake/forked_spec.rb +15 -2
  154. data/spec/cucumber/rake/rcov_spec.rb +2 -2
  155. data/spec/cucumber/rb_support/rb_language_spec.rb +34 -17
  156. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +45 -35
  157. data/spec/cucumber/rb_support/rb_transform_spec.rb +3 -3
  158. data/spec/cucumber/runtime/for_programming_languages_spec.rb +31 -0
  159. data/spec/cucumber/runtime/results_spec.rb +5 -5
  160. data/spec/cucumber/runtime/support_code_spec.rb +13 -2
  161. data/spec/cucumber/runtime_spec.rb +7 -7
  162. data/spec/cucumber/step_match_spec.rb +2 -2
  163. data/spec/cucumber/wire_support/configuration_spec.rb +16 -6
  164. data/spec/cucumber/wire_support/connection_spec.rb +25 -11
  165. data/spec/cucumber/wire_support/wire_exception_spec.rb +3 -3
  166. data/spec/cucumber/wire_support/wire_language_spec.rb +3 -3
  167. data/spec/cucumber/wire_support/wire_packet_spec.rb +4 -4
  168. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +1 -1
  169. data/spec/spec_helper.rb +2 -2
  170. metadata +98 -128
  171. data/legacy_features/html_formatter.feature +0 -8
  172. data/legacy_features/html_formatter/a.html +0 -561
@@ -4,15 +4,32 @@ require 'cucumber/formatter/summary'
4
4
 
5
5
  module Cucumber
6
6
  module Formatter
7
- # This module contains helper methods that are used by formatters
8
- # that print output to the terminal.
7
+
8
+ # This module contains helper methods that are used by formatters that
9
+ # print output to the terminal.
10
+ #
11
+ # FORMAT is a hash of Proc objects, keyed by step-definition types, e.g.
12
+ # "FORMAT[:passed]". The Proc is called for each line of the step's
13
+ # output.
14
+ #
15
+ # format_step calls format_string, format_string calls format_for to obtain
16
+ # the formatting Proc.
17
+ #
18
+ # Example:
19
+ #
20
+ # The ANSI color console formatter defines a map of step-type to output
21
+ # color (e.g. "passed" to "green"), then builds methods named for the
22
+ # step-types (e.g. "def passed"), which themselves wrap the corresponding
23
+ # color-named methods provided by Term::ANSIColor (e.g. "def red").
24
+ #
25
+ # During output, each line is processed by passing it to the formatter Proc
26
+ # which returns the formatted (e.g. colored) string.
27
+
9
28
  module Console
10
29
  extend ANSIColor
11
30
  include Duration
12
31
  include Summary
13
32
 
14
- FORMATS = Hash.new{|hash, format| hash[format] = method(format).to_proc}
15
-
16
33
  def format_step(keyword, step_match, status, source_indent)
17
34
  comment = if source_indent
18
35
  c = (' # ' + step_match.file_colon_line).indent(source_indent)
@@ -38,7 +55,7 @@ module Cucumber
38
55
  end
39
56
 
40
57
  def print_steps(status)
41
- print_elements(step_mother.steps(status), status, 'steps')
58
+ print_elements(runtime.steps(status), status, 'steps')
42
59
  end
43
60
 
44
61
  def print_elements(elements, status, kind)
@@ -60,10 +77,10 @@ module Cucumber
60
77
  end
61
78
 
62
79
  def print_stats(features, options)
63
- @failures = step_mother.scenarios(:failed).select { |s| s.is_a?(Cucumber::Ast::Scenario) || s.is_a?(Cucumber::Ast::OutlineTable::ExampleRow) }
80
+ @failures = runtime.scenarios(:failed).select { |s| s.is_a?(Cucumber::Ast::Scenario) || s.is_a?(Cucumber::Ast::OutlineTable::ExampleRow) }
64
81
  @failures.collect! { |s| (s.is_a?(Cucumber::Ast::OutlineTable::ExampleRow)) ? s.scenario_outline : s }
65
82
 
66
- if !@failures.empty?
83
+ if !@failures.empty?
67
84
  @io.puts format_string("Failing Scenarios:", :failed)
68
85
  @failures.each do |failure|
69
86
  profiles_string = options.custom_profiles.empty? ? '' : (options.custom_profiles.map{|profile| "-p #{profile}" }).join(' ') + ' '
@@ -73,8 +90,8 @@ module Cucumber
73
90
  @io.puts
74
91
  end
75
92
 
76
- @io.puts scenario_summary(step_mother) {|status_count, status| format_string(status_count, status)}
77
- @io.puts step_summary(step_mother) {|status_count, status| format_string(status_count, status)}
93
+ @io.puts scenario_summary(runtime) {|status_count, status| format_string(status_count, status)}
94
+ @io.puts step_summary(runtime) {|status_count, status| format_string(status_count, status)}
78
95
 
79
96
  @io.puts(format_duration(features.duration)) if features && features.duration
80
97
 
@@ -90,22 +107,22 @@ module Cucumber
90
107
  string = "#{message}\n#{e.backtrace.join("\n")}".indent(indent)
91
108
  @io.puts(format_string(string, status))
92
109
  end
93
-
94
- # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/10655
110
+
111
+ # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/10655
95
112
  def linebreaks(s, max)
96
113
  s.gsub(/.{1,#{max}}(?:\s|\Z)/){($& + 5.chr).gsub(/\n\005/,"\n").gsub(/\005/,"\n")}.rstrip
97
114
  end
98
115
 
99
116
  def print_snippets(options)
100
117
  return unless options[:snippets]
101
- undefined = step_mother.steps(:undefined)
118
+ undefined = runtime.steps(:undefined)
102
119
  return if undefined.empty?
103
-
104
- unknown_programming_language = step_mother.unknown_programming_language?
120
+
121
+ unknown_programming_language = runtime.unknown_programming_language?
105
122
  snippets = undefined.map do |step|
106
123
  step_name = Undefined === step.exception ? step.exception.step_name : step.name
107
124
  step_multiline_class = step.multiline_arg ? step.multiline_arg.class : nil
108
- snippet = @step_mother.snippet_text(step.actual_keyword, step_name, step_multiline_class)
125
+ snippet = @runtime.snippet_text(step.actual_keyword, step_name, step_multiline_class)
109
126
  snippet
110
127
  end.compact.uniq
111
128
 
@@ -114,9 +131,9 @@ module Cucumber
114
131
  @io.puts format_string(text, :undefined)
115
132
 
116
133
  if unknown_programming_language
117
- @io.puts format_string("\nIf you want snippets in a different programming language,\n" +
118
- "just make sure a file with the appropriate file extension\n" +
119
- "exists where cucumber looks for step definitions.", :failed)
134
+ @io.puts format_string("\nIf you want snippets in a different programming language," +
135
+ "\njust make sure a file with the appropriate file extension" +
136
+ "\nexists where cucumber looks for step definitions.", :failed)
120
137
  end
121
138
 
122
139
  @io.puts
@@ -125,7 +142,7 @@ module Cucumber
125
142
 
126
143
  def print_passing_wip(options)
127
144
  return unless options[:wip]
128
- passed = step_mother.scenarios(:passed)
145
+ passed = runtime.scenarios(:passed)
129
146
  if passed.any?
130
147
  @io.puts format_string("\nThe --wip switch was used, so I didn't expect anything to pass. These scenarios passed:", :failed)
131
148
  print_elements(passed, :passed, "scenarios")
@@ -177,12 +194,15 @@ module Cucumber
177
194
 
178
195
  private
179
196
 
180
- def format_for(*keys)
181
- key = keys.join('_').to_sym
182
- fmt = FORMATS[key]
183
- raise "No format for #{key.inspect}: #{FORMATS.inspect}" if fmt.nil?
184
- fmt
185
- end
197
+ FORMATS = Hash.new{ |hash, format| hash[format] = method(format).to_proc }
198
+
199
+ def format_for(*keys)
200
+ key = keys.join('_').to_sym
201
+ fmt = FORMATS[key]
202
+ raise "No format for #{key.inspect}: #{FORMATS.inspect}" if fmt.nil?
203
+ fmt
204
+ end
205
+
186
206
  end
187
207
  end
188
208
  end
@@ -4,30 +4,30 @@ require 'cucumber/step_definition_light'
4
4
  module Cucumber
5
5
  module Formatter
6
6
  class Debug
7
- def initialize(step_mother, io, options)
7
+ def initialize(runtime, io, options)
8
8
  @io = io
9
9
  @indent = 0
10
10
  end
11
-
11
+
12
12
  def respond_to?(*args)
13
13
  true
14
14
  end
15
-
15
+
16
16
  def method_missing(name, *args)
17
17
  @indent -= 2 if name.to_s =~ /^after/
18
18
  print(name)
19
19
  @indent += 2 if name.to_s =~ /^before/
20
20
  end
21
-
21
+
22
22
  private
23
-
23
+
24
24
  def print(text)
25
25
  @io.puts "#{indent}#{text}"
26
26
  end
27
-
27
+
28
28
  def indent
29
29
  (' ' * @indent)
30
30
  end
31
31
  end
32
32
  end
33
- end
33
+ end
@@ -6,7 +6,7 @@ module Cucumber
6
6
  # <tt>time</tt> format.
7
7
  def format_duration(seconds)
8
8
  m, s = seconds.divmod(60)
9
- "#{m}m#{'%.3f' % s}s"
9
+ "#{m}m#{'%.3f' % s}s"
10
10
  end
11
11
  end
12
12
  end
@@ -44,6 +44,7 @@ module Cucumber
44
44
  end
45
45
  @gf.match(match)
46
46
  end
47
+ @step_time = Time.now
47
48
  end
48
49
 
49
50
  def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
@@ -66,6 +67,12 @@ module Cucumber
66
67
  def before_examples(examples)
67
68
  @gf.examples(examples.gherkin_statement)
68
69
  end
70
+
71
+ #used for capturing duration
72
+ def after_step(step)
73
+ step_finish = (Time.now - @step_time)
74
+ @gf.append_duration(step_finish)
75
+ end
69
76
 
70
77
  def after_feature(feature)
71
78
  @gf.eof
@@ -9,7 +9,7 @@ module Cucumber
9
9
  class Gpretty < GherkinFormatterAdapter
10
10
  include Io
11
11
 
12
- def initialize(step_mother, io, options)
12
+ def initialize(runtime, io, options)
13
13
  @io = ensure_io(io, "json")
14
14
  super(Gherkin::Formatter::PrettyFormatter.new(@io, false), true)
15
15
  end
@@ -10,9 +10,9 @@ module Cucumber
10
10
  include Duration
11
11
  include Io
12
12
 
13
- def initialize(step_mother, path_or_io, options)
13
+ def initialize(runtime, path_or_io, options)
14
14
  @io = ensure_io(path_or_io, "html")
15
- @step_mother = step_mother
15
+ @runtime = runtime
16
16
  @options = options
17
17
  @buffer = {}
18
18
  @builder = create_builder(@io)
@@ -47,15 +47,15 @@ module Cucumber
47
47
  # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
48
48
  @builder.declare!(
49
49
  :DOCTYPE,
50
- :html,
51
- :PUBLIC,
50
+ :html,
51
+ :PUBLIC,
52
52
  '-//W3C//DTD XHTML 1.0 Strict//EN',
53
53
  'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
54
54
  )
55
55
 
56
56
  @builder << '<html xmlns ="http://www.w3.org/1999/xhtml">'
57
57
  @builder.head do
58
- @builder.meta(:content => 'text/html;charset=utf-8')
58
+ @builder.meta('http-equiv' => 'Content-Type', :content => 'text/html;charset=utf-8')
59
59
  @builder.title 'Cucumber'
60
60
  inline_css
61
61
  inline_js
@@ -93,7 +93,7 @@ module Cucumber
93
93
  def after_feature(feature)
94
94
  @builder << '</div>'
95
95
  end
96
-
96
+
97
97
  def before_comment(comment)
98
98
  @builder << '<pre class="comment">'
99
99
  end
@@ -101,22 +101,22 @@ module Cucumber
101
101
  def after_comment(comment)
102
102
  @builder << '</pre>'
103
103
  end
104
-
104
+
105
105
  def comment_line(comment_line)
106
106
  @builder.text!(comment_line)
107
107
  @builder.br
108
108
  end
109
-
109
+
110
110
  def after_tags(tags)
111
111
  @tag_spacer = nil
112
112
  end
113
-
113
+
114
114
  def tag_name(tag_name)
115
115
  @builder.text!(@tag_spacer) if @tag_spacer
116
116
  @tag_spacer = ' '
117
117
  @builder.span(tag_name, :class => 'tag')
118
118
  end
119
-
119
+
120
120
  def feature_name(keyword, name)
121
121
  lines = name.split(/\r?\n/)
122
122
  return if lines.empty?
@@ -130,17 +130,17 @@ module Cucumber
130
130
  end
131
131
  end
132
132
  end
133
-
133
+
134
134
  def before_background(background)
135
135
  @in_background = true
136
136
  @builder << '<div class="background">'
137
137
  end
138
-
138
+
139
139
  def after_background(background)
140
140
  @in_background = nil
141
141
  @builder << '</div>'
142
142
  end
143
-
143
+
144
144
  def background_name(keyword, name, file_colon_line, source_indent)
145
145
  @listing_background = true
146
146
  @builder.h3(:id => "background_#{@scenario_number}") do |h3|
@@ -156,7 +156,7 @@ module Cucumber
156
156
  css_class = {
157
157
  Ast::Scenario => 'scenario',
158
158
  Ast::ScenarioOutline => 'scenario outline'
159
- }[feature_element.class]
159
+ }[feature_element.class]
160
160
  @builder << "<div class='#{css_class}'>"
161
161
  end
162
162
 
@@ -176,21 +176,21 @@ module Cucumber
176
176
  @builder.span(name, :class => 'val')
177
177
  end
178
178
  end
179
-
179
+
180
180
  def before_outline_table(outline_table)
181
181
  @outline_row = 0
182
182
  @builder << '<table>'
183
183
  end
184
-
184
+
185
185
  def after_outline_table(outline_table)
186
186
  @builder << '</table>'
187
187
  @outline_row = nil
188
188
  end
189
-
189
+
190
190
  def before_examples(examples)
191
191
  @builder << '<div class="examples">'
192
192
  end
193
-
193
+
194
194
  def after_examples(examples)
195
195
  @builder << '</div>'
196
196
  end
@@ -202,11 +202,11 @@ module Cucumber
202
202
  @builder.span(name, :class => 'val')
203
203
  end
204
204
  end
205
-
205
+
206
206
  def before_steps(steps)
207
207
  @builder << '<ol>'
208
208
  end
209
-
209
+
210
210
  def after_steps(steps)
211
211
  @builder << '</ol>'
212
212
  end
@@ -237,17 +237,18 @@ module Cucumber
237
237
  end
238
238
  @status = status
239
239
  return if @hide_this_step
240
- set_scenario_color(status)
241
- @builder << "<li id='#{@step_id}' class='step #{status}'>"
240
+ set_scenario_color(status)
241
+ @builder << "<li id='#{@step_id}' class='step #{status}'>"
242
242
  end
243
243
 
244
244
  def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
245
245
  return if @hide_this_step
246
246
  # print snippet for undefined steps
247
247
  if status == :undefined
248
+ keyword = @step.actual_keyword if @step.respond_to?(:actual_keyword)
248
249
  step_multiline_class = @step.multiline_arg ? @step.multiline_arg.class : nil
249
250
  @builder.pre do |pre|
250
- pre << @step_mother.snippet_text(@step.actual_keyword,step_match.instance_variable_get("@name") || '',step_multiline_class)
251
+ pre << @runtime.snippet_text(keyword,step_match.instance_variable_get("@name") || '',step_multiline_class)
251
252
  end
252
253
  end
253
254
  @builder << '</li>'
@@ -255,10 +256,8 @@ module Cucumber
255
256
  end
256
257
 
257
258
  def step_name(keyword, step_match, status, source_indent, background, file_colon_line)
258
- @step_matches ||= []
259
259
  background_in_scenario = background && !@listing_background
260
- @skip_step = @step_matches.index(step_match) || background_in_scenario
261
- @step_matches << step_match
260
+ @skip_step = background_in_scenario
262
261
 
263
262
  unless @skip_step
264
263
  build_step(keyword, step_match, status)
@@ -280,7 +279,7 @@ module Cucumber
280
279
  @builder << '<table>'
281
280
  end
282
281
  end
283
-
282
+
284
283
  def after_multiline_arg(multiline_arg)
285
284
  return if @hide_this_step || @skip_step
286
285
  if Ast::Table === multiline_arg
@@ -294,15 +293,15 @@ module Cucumber
294
293
  @builder << h(string).gsub("\n", '&#x000A;')
295
294
  end
296
295
  end
297
-
298
-
296
+
297
+
299
298
  def before_table_row(table_row)
300
299
  @row_id = table_row.dom_id
301
300
  @col_index = 0
302
301
  return if @hide_this_step
303
302
  @builder << "<tr class='step' id='#{@row_id}'>"
304
303
  end
305
-
304
+
306
305
  def after_table_row(table_row)
307
306
  return if @hide_this_step
308
307
  print_table_row_messages
@@ -326,7 +325,7 @@ module Cucumber
326
325
 
327
326
  def table_cell_value(value, status)
328
327
  return if @hide_this_step
329
-
328
+
330
329
  @cell_type = @outline_row == 0 ? :th : :td
331
330
  attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'step'}
332
331
  attributes[:class] += " #{status}" if status
@@ -339,10 +338,10 @@ module Cucumber
339
338
  @delayed_messages << message
340
339
  #@builder.pre(message, :class => 'message')
341
340
  end
342
-
341
+
343
342
  def print_messages
344
343
  return if @delayed_messages.empty?
345
-
344
+
346
345
  #@builder.ol do
347
346
  @delayed_messages.each do |ann|
348
347
  @builder.li(:class => 'step message') do
@@ -352,16 +351,16 @@ module Cucumber
352
351
  #end
353
352
  empty_messages
354
353
  end
355
-
354
+
356
355
  def print_table_row_messages
357
356
  return if @delayed_messages.empty?
358
-
357
+
359
358
  @builder.td(:class => 'message') do
360
359
  @builder << @delayed_messages.join(", ")
361
360
  end
362
361
  empty_messages
363
362
  end
364
-
363
+
365
364
  def empty_messages
366
365
  @delayed_messages = []
367
366
  end
@@ -383,7 +382,7 @@ module Cucumber
383
382
  message = "#{message} (#{exception.class})"
384
383
  end
385
384
 
386
- @builder.pre do
385
+ @builder.pre do
387
386
  @builder.text!(message)
388
387
  end
389
388
  end
@@ -406,7 +405,7 @@ module Cucumber
406
405
  set_scenario_color_failed
407
406
  end
408
407
  end
409
-
408
+
410
409
  def set_scenario_color_failed
411
410
  @builder.script do
412
411
  @builder.text!("makeRed('cucumber-header');") unless @header_red
@@ -415,12 +414,12 @@ module Cucumber
415
414
  @scenario_red = true
416
415
  end
417
416
  end
418
-
417
+
419
418
  def set_scenario_color_pending
420
419
  @builder.script do
421
420
  @builder.text!("makeYellow('cucumber-header');") unless @header_red
422
421
  @builder.text!("makeYellow('scenario_#{@scenario_number}');") unless @scenario_red
423
- end
422
+ end
424
423
  end
425
424
 
426
425
  def get_step_count(features)
@@ -468,16 +467,16 @@ module Cucumber
468
467
  @builder.span(keyword, :class => 'keyword')
469
468
  @builder.span(:class => 'step val') do |name|
470
469
  name << h(step_name).gsub(/&lt;span class=&quot;(.*?)&quot;&gt;/, '<span class="\1">').gsub(/&lt;\/span&gt;/, '</span>')
471
- end
470
+ end
472
471
  end
473
-
472
+
474
473
  step_file = step_match.file_colon_line
475
474
  step_file.gsub(/^([^:]*\.rb):(\d*)/) do
476
475
  if ENV['TM_PROJECT_DIRECTORY']
477
476
  step_file = "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
478
477
  end
479
478
  end
480
-
479
+
481
480
  @builder.div(:class => 'step_file') do |div|
482
481
  @builder.span do
483
482
  @builder << step_file
@@ -509,29 +508,29 @@ module Cucumber
509
508
  def inline_jquery
510
509
  File.read(File.dirname(__FILE__) + '/jquery-min.js')
511
510
  end
512
-
511
+
513
512
  def inline_js_content
514
513
  <<-EOF
515
514
 
516
515
  SCENARIOS = "h3[id^='scenario_'],h3[id^=background_]";
517
-
516
+
518
517
  $(document).ready(function() {
519
518
  $(SCENARIOS).css('cursor', 'pointer');
520
519
  $(SCENARIOS).click(function() {
521
520
  $(this).siblings().toggle(250);
522
521
  });
523
-
522
+
524
523
  $("#collapser").css('cursor', 'pointer');
525
524
  $("#collapser").click(function() {
526
525
  $(SCENARIOS).siblings().hide();
527
526
  });
528
-
527
+
529
528
  $("#expander").css('cursor', 'pointer');
530
529
  $("#expander").click(function() {
531
530
  $(SCENARIOS).siblings().show();
532
531
  });
533
532
  })
534
-
533
+
535
534
  function moveProgressBar(percentDone) {
536
535
  $("cucumber-header").css('width', percentDone +"%");
537
536
  }
@@ -543,7 +542,7 @@ module Cucumber
543
542
  $('#'+element_id).css('background', '#FAF834');
544
543
  $('#'+element_id).css('color', '#000000');
545
544
  }
546
-
545
+
547
546
  EOF
548
547
  end
549
548
 
@@ -580,12 +579,12 @@ module Cucumber
580
579
 
581
580
  def print_stat_string(features)
582
581
  string = String.new
583
- string << dump_count(@step_mother.scenarios.length, "scenario")
584
- scenario_count = print_status_counts{|status| @step_mother.scenarios(status)}
582
+ string << dump_count(@runtime.scenarios.length, "scenario")
583
+ scenario_count = print_status_counts{|status| @runtime.scenarios(status)}
585
584
  string << scenario_count if scenario_count
586
585
  string << "<br />"
587
- string << dump_count(@step_mother.steps.length, "step")
588
- step_count = print_status_counts{|status| @step_mother.steps(status)}
586
+ string << dump_count(@runtime.steps.length, "step")
587
+ step_count = print_status_counts{|status| @runtime.steps(status)}
589
588
  string << step_count if step_count
590
589
  end
591
590