cucumber 0.8.5 → 0.8.6

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 (181) hide show
  1. data/.rspec +1 -1
  2. data/LICENSE +1 -1
  3. data/Rakefile +5 -51
  4. data/bin/cucumber +7 -1
  5. data/cucumber.gemspec +463 -679
  6. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -1
  7. data/examples/i18n/he/features/step_definitons/calculator_steps.rb +1 -1
  8. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +4 -7
  9. data/examples/i18n/ru/features/division.feature +2 -2
  10. data/examples/i18n/tr/features/step_definitons/hesap_makinesi_adimlari.rb +3 -3
  11. data/examples/sinatra/features/support/env.rb +2 -5
  12. data/examples/v8/features/fibonacci.feature +1 -1
  13. data/examples/watir/features/step_definitions/search_steps.rb +1 -1
  14. data/features/background.feature +284 -95
  15. data/features/custom_formatter.feature +3 -73
  16. data/features/json_formatter.feature +160 -245
  17. data/features/step_definitions/cucumber_steps.rb +7 -153
  18. data/features/support/env.rb +18 -140
  19. data/fixtures/junit/features/pending.feature +3 -1
  20. data/fixtures/self_test/features/support/env.rb +8 -0
  21. data/fixtures/tickets/features.html +1 -1
  22. data/gem_tasks/examples.rake +1 -1
  23. data/lib/cucumber.rb +12 -0
  24. data/lib/cucumber/ast.rb +1 -1
  25. data/lib/cucumber/ast/background.rb +21 -5
  26. data/lib/cucumber/ast/examples.rb +12 -4
  27. data/lib/cucumber/ast/feature.rb +13 -5
  28. data/lib/cucumber/ast/feature_element.rb +9 -4
  29. data/lib/cucumber/ast/outline_table.rb +4 -4
  30. data/lib/cucumber/ast/scenario.rb +7 -5
  31. data/lib/cucumber/ast/scenario_outline.rb +23 -15
  32. data/lib/cucumber/ast/step.rb +5 -0
  33. data/lib/cucumber/ast/step_invocation.rb +21 -15
  34. data/lib/cucumber/ast/table.rb +14 -8
  35. data/lib/cucumber/ast/tree_walker.rb +10 -48
  36. data/lib/cucumber/cli/configuration.rb +33 -8
  37. data/lib/cucumber/cli/main.rb +20 -35
  38. data/lib/cucumber/cli/options.rb +8 -7
  39. data/lib/cucumber/cli/profile_loader.rb +2 -0
  40. data/lib/cucumber/core_ext/proc.rb +2 -1
  41. data/lib/cucumber/feature_file.rb +47 -15
  42. data/lib/cucumber/formatter/ansicolor.rb +3 -5
  43. data/lib/cucumber/formatter/console.rb +27 -23
  44. data/lib/cucumber/formatter/cucumber.css +34 -17
  45. data/lib/cucumber/formatter/cucumber.sass +173 -182
  46. data/lib/cucumber/formatter/html.rb +46 -11
  47. data/lib/cucumber/formatter/io.rb +2 -4
  48. data/lib/cucumber/formatter/json.rb +15 -152
  49. data/lib/cucumber/formatter/json_pretty.rb +5 -6
  50. data/lib/cucumber/formatter/junit.rb +28 -22
  51. data/lib/cucumber/formatter/pdf.rb +6 -6
  52. data/lib/cucumber/formatter/pretty.rb +5 -5
  53. data/lib/cucumber/formatter/rerun.rb +22 -11
  54. data/lib/cucumber/formatter/unicode.rb +41 -20
  55. data/lib/cucumber/js_support/js_dsl.js +4 -4
  56. data/lib/cucumber/js_support/js_language.rb +9 -5
  57. data/lib/cucumber/js_support/js_snippets.rb +2 -2
  58. data/lib/cucumber/language_support.rb +2 -2
  59. data/lib/cucumber/parser/gherkin_builder.rb +35 -30
  60. data/lib/cucumber/platform.rb +8 -8
  61. data/lib/cucumber/py_support/py_language.rb +2 -2
  62. data/lib/cucumber/rake/task.rb +80 -31
  63. data/lib/cucumber/rb_support/rb_dsl.rb +1 -0
  64. data/lib/cucumber/rb_support/rb_language.rb +10 -8
  65. data/lib/cucumber/rb_support/rb_step_definition.rb +8 -0
  66. data/lib/cucumber/rb_support/rb_transform.rb +17 -0
  67. data/lib/cucumber/rb_support/rb_world.rb +26 -18
  68. data/lib/cucumber/rspec/doubles.rb +3 -3
  69. data/lib/cucumber/step_match.rb +6 -2
  70. data/lib/cucumber/step_mother.rb +6 -427
  71. data/lib/cucumber/wire_support/configuration.rb +4 -1
  72. data/lib/cucumber/wire_support/wire_language.rb +3 -10
  73. data/spec/cucumber/ast/background_spec.rb +68 -6
  74. data/spec/cucumber/ast/feature_factory.rb +5 -4
  75. data/spec/cucumber/ast/feature_spec.rb +4 -4
  76. data/spec/cucumber/ast/outline_table_spec.rb +1 -1
  77. data/spec/cucumber/ast/scenario_outline_spec.rb +15 -11
  78. data/spec/cucumber/ast/scenario_spec.rb +4 -4
  79. data/spec/cucumber/ast/step_spec.rb +3 -3
  80. data/spec/cucumber/ast/table_spec.rb +38 -2
  81. data/spec/cucumber/ast/tree_walker_spec.rb +2 -2
  82. data/spec/cucumber/broadcaster_spec.rb +1 -1
  83. data/spec/cucumber/cli/configuration_spec.rb +32 -6
  84. data/spec/cucumber/cli/drb_client_spec.rb +2 -3
  85. data/spec/cucumber/cli/main_spec.rb +43 -43
  86. data/spec/cucumber/cli/options_spec.rb +28 -1
  87. data/spec/cucumber/cli/profile_loader_spec.rb +1 -1
  88. data/spec/cucumber/core_ext/proc_spec.rb +1 -1
  89. data/spec/cucumber/formatter/ansicolor_spec.rb +1 -1
  90. data/spec/cucumber/formatter/duration_spec.rb +1 -1
  91. data/spec/cucumber/formatter/html_spec.rb +3 -5
  92. data/spec/cucumber/formatter/junit_spec.rb +16 -2
  93. data/spec/cucumber/formatter/progress_spec.rb +1 -1
  94. data/spec/cucumber/formatter/spec_helper.rb +11 -12
  95. data/spec/cucumber/rb_support/rb_language_spec.rb +241 -28
  96. data/spec/cucumber/rb_support/rb_step_definition_spec.rb +33 -28
  97. data/spec/cucumber/rb_support/regexp_argument_matcher_spec.rb +1 -1
  98. data/spec/cucumber/step_match_spec.rb +11 -9
  99. data/spec/cucumber/wire_support/configuration_spec.rb +1 -1
  100. data/spec/cucumber/wire_support/connection_spec.rb +1 -1
  101. data/spec/cucumber/wire_support/wire_exception_spec.rb +1 -1
  102. data/spec/cucumber/wire_support/wire_language_spec.rb +1 -1
  103. data/spec/cucumber/wire_support/wire_packet_spec.rb +1 -1
  104. data/spec/cucumber/wire_support/wire_step_definition_spec.rb +1 -1
  105. data/spec/cucumber/world/pending_spec.rb +2 -2
  106. data/spec/spec_helper.rb +13 -20
  107. metadata +11 -222
  108. data/.gitignore +0 -20
  109. data/Caliper.yml +0 -4
  110. data/History.txt +0 -1552
  111. data/README.rdoc +0 -26
  112. data/VERSION.yml +0 -5
  113. data/examples/i18n/ro/features/suma.feature +0 -11
  114. data/features/announce.feature +0 -164
  115. data/features/around_hooks.feature +0 -232
  116. data/features/bug_371.feature +0 -32
  117. data/features/bug_464.feature +0 -16
  118. data/features/bug_475.feature +0 -42
  119. data/features/bug_585_tab_indentation.feature +0 -22
  120. data/features/bug_600.feature +0 -67
  121. data/features/call_steps_from_stepdefs.feature +0 -154
  122. data/features/cucumber_cli.feature +0 -591
  123. data/features/cucumber_cli_outlines.feature +0 -117
  124. data/features/default_snippets.feature +0 -42
  125. data/features/diffing.feature +0 -25
  126. data/features/drb_server_integration.feature +0 -174
  127. data/features/exception_in_after_block.feature +0 -127
  128. data/features/exception_in_after_step_block.feature +0 -104
  129. data/features/exception_in_before_block.feature +0 -98
  130. data/features/exclude_files.feature +0 -20
  131. data/features/expand.feature +0 -60
  132. data/features/html_formatter.feature +0 -8
  133. data/features/html_formatter/a.html +0 -582
  134. data/features/junit_formatter.feature +0 -88
  135. data/features/language_from_header.feature +0 -30
  136. data/features/language_help.feature +0 -78
  137. data/features/listener_debugger_formatter.feature +0 -42
  138. data/features/multiline_names.feature +0 -44
  139. data/features/negative_tagged_hooks.feature +0 -60
  140. data/features/post_configuration_hook.feature +0 -37
  141. data/features/profiles.feature +0 -126
  142. data/features/rake_task.feature +0 -152
  143. data/features/report_called_undefined_steps.feature +0 -34
  144. data/features/rerun_formatter.feature +0 -45
  145. data/features/simplest.feature +0 -11
  146. data/features/snippet.feature +0 -23
  147. data/features/snippets_when_using_star_keyword.feature +0 -36
  148. data/features/step_definitions/extra_steps.rb +0 -2
  149. data/features/step_definitions/simplest_steps.rb +0 -3
  150. data/features/step_definitions/wire_steps.rb +0 -32
  151. data/features/support/env.rb.simplest +0 -7
  152. data/features/support/fake_wire_server.rb +0 -77
  153. data/features/table_diffing.feature +0 -45
  154. data/features/table_mapping.feature +0 -34
  155. data/features/tag_logic.feature +0 -258
  156. data/features/transform.feature +0 -245
  157. data/features/unicode_table.feature +0 -35
  158. data/features/usage_and_stepdefs_formatter.feature +0 -169
  159. data/features/wire_protocol.feature +0 -332
  160. data/features/wire_protocol_table_diffing.feature +0 -119
  161. data/features/wire_protocol_tags.feature +0 -87
  162. data/features/wire_protocol_timeouts.feature +0 -63
  163. data/features/work_in_progress.feature +0 -156
  164. data/fixtures/json/features/pystring.feature +0 -8
  165. data/fixtures/self_test/features/background/background_tagged_before_on_outline.feature +0 -12
  166. data/fixtures/self_test/features/background/background_with_name.feature +0 -7
  167. data/fixtures/self_test/features/background/failing_background.feature +0 -12
  168. data/fixtures/self_test/features/background/failing_background_after_success.feature +0 -11
  169. data/fixtures/self_test/features/background/multiline_args_background.feature +0 -32
  170. data/fixtures/self_test/features/background/passing_background.feature +0 -10
  171. data/fixtures/self_test/features/background/pending_background.feature +0 -10
  172. data/fixtures/self_test/features/background/scenario_outline_failing_background.feature +0 -16
  173. data/fixtures/self_test/features/background/scenario_outline_passing_background.feature +0 -16
  174. data/gem_tasks/features.rake +0 -14
  175. data/gem_tasks/sdoc.rake +0 -12
  176. data/lib/cucumber/ast/py_string.rb +0 -80
  177. data/lib/cucumber/formatter/color_io.rb +0 -23
  178. data/lib/cucumber/formatter/tag_cloud.rb +0 -35
  179. data/spec/cucumber/ast/py_string_spec.rb +0 -40
  180. data/spec/cucumber/formatter/color_io_spec.rb +0 -29
  181. data/spec/cucumber/step_mother_spec.rb +0 -302
@@ -20,20 +20,23 @@ module Cucumber
20
20
  @scenario_number = 0
21
21
  @step_number = 0
22
22
  @header_red = nil
23
+ @delayed_messages = []
24
+ @img_id = 0
23
25
  end
24
26
 
25
- def embed(file, mime_type)
27
+ def embed(src, mime_type, label)
26
28
  case(mime_type)
27
29
  when /^image\/(png|gif|jpg|jpeg)/
28
- embed_image(file)
30
+ embed_image(src, label)
29
31
  end
30
32
  end
31
33
 
32
- def embed_image(file)
33
- id = file.hash
34
+ def embed_image(src, label)
35
+ id = "img_#{@img_id}"
36
+ @img_id += 1
34
37
  @builder.span(:class => 'embed') do |pre|
35
- pre << %{<a href="" onclick="img=document.getElementById('#{id}'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false">Screenshot</a><br>&nbsp;
36
- <img id="#{id}" style="display: none" src="#{file}"/>}
38
+ pre << %{<a href="" onclick="img=document.getElementById('#{id}'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');return false">#{label}</a><br>&nbsp;
39
+ <img id="#{id}" style="display: none" src="#{src}"/>}
37
40
  end
38
41
  end
39
42
 
@@ -163,6 +166,9 @@ module Cucumber
163
166
  end
164
167
 
165
168
  def scenario_name(keyword, name, file_colon_line, source_indent)
169
+ @builder.span(:class => 'scenario_file') do
170
+ @builder << file_colon_line
171
+ end
166
172
  @listing_background = false
167
173
  @builder.h3(:id => "scenario_#{@scenario_number}") do
168
174
  @builder.span(keyword + ':', :class => 'keyword')
@@ -245,6 +251,7 @@ module Cucumber
245
251
  end
246
252
  end
247
253
  @builder << '</li>'
254
+ print_messages
248
255
  end
249
256
 
250
257
  def step_name(keyword, step_match, status, source_indent, background)
@@ -281,7 +288,7 @@ module Cucumber
281
288
  end
282
289
  end
283
290
 
284
- def py_string(string)
291
+ def doc_string(string)
285
292
  return if @hide_this_step
286
293
  @builder.pre(:class => 'val') do |pre|
287
294
  @builder << string.gsub("\n", '&#x000A;')
@@ -298,6 +305,7 @@ module Cucumber
298
305
 
299
306
  def after_table_row(table_row)
300
307
  return if @hide_this_step
308
+ print_table_row_messages
301
309
  @builder << '</tr>'
302
310
  if table_row.exception
303
311
  @builder.tr do
@@ -327,8 +335,35 @@ module Cucumber
327
335
  @col_index += 1
328
336
  end
329
337
 
330
- def announce(announcement)
331
- @builder.pre(announcement, :class => 'announcement')
338
+ def puts(message)
339
+ @delayed_messages << message
340
+ #@builder.pre(message, :class => 'message')
341
+ end
342
+
343
+ def print_messages
344
+ return if @delayed_messages.empty?
345
+
346
+ #@builder.ol do
347
+ @delayed_messages.each do |ann|
348
+ @builder.li(:class => 'step message') do
349
+ @builder << ann
350
+ end
351
+ end
352
+ #end
353
+ empty_messages
354
+ end
355
+
356
+ def print_table_row_messages
357
+ return if @delayed_messages.empty?
358
+
359
+ @builder.td(:class => 'message') do
360
+ @builder << @delayed_messages.join(", ")
361
+ end
362
+ empty_messages
363
+ end
364
+
365
+ def empty_messages
366
+ @delayed_messages = []
332
367
  end
333
368
 
334
369
  protected
@@ -358,7 +393,7 @@ module Cucumber
358
393
  end
359
394
 
360
395
  def set_scenario_color(status)
361
- if status == :undefined
396
+ if status == :undefined or status == :pending
362
397
  set_scenario_color_pending
363
398
  end
364
399
  if status == :failed
@@ -523,7 +558,7 @@ module Cucumber
523
558
  end
524
559
 
525
560
  def backtrace_line(line)
526
- line.gsub(/^([^:]*\.(?:rb|feature|haml)):(\d*)/) do
561
+ line.gsub(/\A([^:]*\.(?:rb|feature|haml)):(\d*).*\z/) do
527
562
  if ENV['TM_PROJECT_DIRECTORY']
528
563
  "<a href=\"txmt://open?url=file://#{File.expand_path($1)}&line=#{$2}\">#{$1}:#{$2}</a> "
529
564
  else
@@ -1,11 +1,9 @@
1
- require 'cucumber/formatter/color_io'
2
-
3
1
  module Cucumber
4
2
  module Formatter
5
3
  module Io
6
4
  def ensure_io(path_or_io, name)
7
5
  return nil if path_or_io.nil?
8
- return path_or_io if ColorIO === path_or_io || path_or_io.respond_to?(:write)
6
+ return path_or_io if path_or_io.respond_to?(:write)
9
7
  file = File.open(path_or_io, Cucumber.file_mode('w'))
10
8
  at_exit do
11
9
  unless file.closed?
@@ -30,4 +28,4 @@ module Cucumber
30
28
  end
31
29
  end
32
30
  end
33
- end
31
+ end
@@ -1,166 +1,29 @@
1
- require "json"
2
- require "cucumber/formatter/io"
1
+ require 'cucumber/formatter/gherkin_formatter_adapter'
2
+ require 'cucumber/formatter/io'
3
+ require 'gherkin/formatter/argument'
4
+ require 'gherkin/formatter/json_formatter'
3
5
 
4
6
  module Cucumber
5
7
  module Formatter
6
8
  # The formatter used for <tt>--format json</tt>
7
- class Json
8
- class Error < StandardError
9
- end
10
-
9
+ class Json < GherkinFormatterAdapter
11
10
  include Io
12
11
 
13
12
  def initialize(step_mother, io, options)
14
- @io = ensure_io(io, "json")
15
- @options = options
16
- end
17
-
18
- def before_features(features)
19
- @json = {:features => []}
20
- end
21
-
22
- def before_feature(feature)
23
- @current_object = {:file => feature.file, :name => feature.name}
24
- @json[:features] << @current_object
25
- end
26
-
27
- def before_tags(tags)
28
- @current_object[:tags] = tags.tag_names.to_a
29
- end
30
-
31
- def before_background(background)
32
- background = {}
33
- @current_object[:background] = background
34
- @current_object = background
35
- end
36
-
37
- def after_background(background)
38
- @current_object = last_feature
39
- end
40
-
41
- def before_feature_element(feature_element)
42
- elements = @current_object[:elements] ||= []
43
-
44
- # change current object to the feature_element
45
- @current_object = {}
46
- elements << @current_object
47
- end
48
-
49
- def scenario_name(keyword, name, file_colon_line, source_indent)
50
- @current_object[:keyword] = keyword
51
- @current_object[:name] = name
52
- @current_object[:file_colon_line] = file_colon_line
53
- end
54
-
55
- def before_steps(steps)
56
- @current_object[:steps] = []
57
- end
58
-
59
- def before_step(step)
60
- @current_step = {}
61
- @current_object[:steps] << @current_step
13
+ @io = ensure_io(io, "json")
14
+ @obj = {'features' => []}
15
+ super(Gherkin::Formatter::JSONFormatter.new(nil), false)
62
16
  end
63
17
 
64
- def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
65
- if exception
66
- @current_step[:exception] = exception_hash_for(exception)
67
- end
68
- end
69
-
70
- def step_name(keyword, step_match, status, source_indent, background)
71
- @current_step[:status] = status
72
- @current_step[:keyword] = keyword
73
- @current_step[:name] = "#{step_match.name || step_match.format_args}"
74
- @current_step[:file_colon_line] = step_match.file_colon_line
75
- end
76
-
77
- def after_step(step)
78
- @current_step = nil
79
- end
80
-
81
- def before_examples(examples)
82
- @current_object[:examples] = {}
83
- end
84
-
85
- def examples_name(keyword, name)
86
- @current_object[:examples][:name] = "#{keyword} #{name}"
87
- end
88
-
89
- def before_outline_table(*args)
90
- @current_object[:examples][:table] = []
91
- end
92
-
93
- def before_table_row(row)
94
- @current_row = {:cells => []}
95
-
96
- if @current_object.member? :examples
97
- @current_object[:examples][:table] << @current_row
98
- elsif @current_step
99
- (@current_step[:table] ||= []) << @current_row
100
- else
101
- internal_error
102
- end
103
- end
104
-
105
- def table_cell_value(value, status)
106
- @current_row[:cells] << {:text => value, :status => status}
107
- end
108
-
109
- def after_table_row(row)
110
- if row.exception
111
- @current_row[:exception] = exception_hash_for(row.exception)
112
- end
113
- @current_row = nil
114
- end
115
-
116
- def py_string(string)
117
- @current_step[:py_string] = string
118
- end
119
-
120
- def after_feature_element(feature_element)
121
- # change current object back to the last feature
122
- @current_object = last_feature
18
+ def after_feature(feature)
19
+ super
20
+ @obj['features'] << @gf.gherkin_object
123
21
  end
124
22
 
125
23
  def after_features(features)
126
- @io.write json_string
127
- @io.flush
24
+ @io.write(@obj.to_json)
128
25
  end
129
-
130
- def embed(file, mime_type)
131
- obj = @current_step || @current_object
132
- obj[:embedded] ||= []
133
-
134
- obj[:embedded] << {
135
- :file => file,
136
- :mime_type => mime_type,
137
- :data => [File.read(file)].pack("m*") # base64
138
- }
139
- end
140
-
141
- private
142
-
143
- def json_string
144
- @json.to_json
145
- end
146
-
147
- def last_feature
148
- @json[:features].last
149
- end
150
-
151
- def exception_hash_for(e)
152
- {
153
- :class => e.class.name,
154
- :message => e.message,
155
- :backtrace => e.backtrace
156
- }
157
- end
158
-
159
- def internal_error
160
- raise Error, "you've found a bug in the JSON formatter!"
161
- end
162
-
163
- end # Json
164
- end # Formatter
165
- end # Cucumber
26
+ end
27
+ end
28
+ end
166
29
 
@@ -1,14 +1,13 @@
1
- require "cucumber/formatter/json"
1
+ require 'cucumber/formatter/json'
2
2
 
3
3
  module Cucumber
4
4
  module Formatter
5
5
  # The formatter used for <tt>--format json_pretty</tt>
6
6
  class JsonPretty < Json
7
-
8
- def json_string
9
- JSON.pretty_generate @json
7
+ def after_features(features)
8
+ @io.write(JSON.pretty_generate(@obj))
10
9
  end
11
-
12
10
  end
13
11
  end
14
- end
12
+ end
13
+
@@ -21,17 +21,22 @@ module Cucumber
21
21
 
22
22
  def before_feature(feature)
23
23
  @current_feature = feature
24
- @failures = @errors = @tests = 0
24
+ @failures = @errors = @tests = @skipped = 0
25
25
  @builder = OrderedXmlMarkup.new( :indent => 2 )
26
26
  @time = 0
27
27
  end
28
28
 
29
+ def before_feature_element(feature_element)
30
+ @in_examples = Ast::ScenarioOutline === feature_element
31
+ end
32
+
29
33
  def after_feature(feature)
30
34
  @testsuite = OrderedXmlMarkup.new( :indent => 2 )
31
35
  @testsuite.instruct!
32
36
  @testsuite.testsuite(
33
37
  :failures => @failures,
34
38
  :errors => @errors,
39
+ :skipped => @skipped,
35
40
  :tests => @tests,
36
41
  :time => "%.6f" % @time,
37
42
  :name => @feature_name ) do
@@ -56,13 +61,8 @@ module Cucumber
56
61
  end
57
62
 
58
63
  def scenario_name(keyword, name, file_colon_line, source_indent)
59
- # TODO: What's all this ugly weird code doing? Why not just use keyword and name????
60
- scenario_name = name.strip.delete(".\r\n")
61
- scenario_name = "Unnamed scenario" if name == ""
62
- @scenario = scenario_name
63
- description = "Scenario"
64
- description << " outline" if keyword.include?('Scenario Outline')
65
- @output = "#{description}: #{@scenario}\n\n"
64
+ @scenario = (name.nil? || name == "") ? "Unnamed scenario" : name.split("\n")[0]
65
+ @output = "#{keyword}: #{@scenario}\n\n"
66
66
  end
67
67
 
68
68
  def before_steps(steps)
@@ -96,7 +96,7 @@ module Cucumber
96
96
  end
97
97
 
98
98
  def after_table_row(table_row)
99
- return unless @in_examples
99
+ return unless @in_examples and Cucumber::Ast::OutlineTable::ExampleRow === table_row
100
100
  duration = Time.now - @table_start
101
101
  unless @header_row
102
102
  name_suffix = " (outline example : #{table_row.name})"
@@ -116,20 +116,23 @@ module Cucumber
116
116
  @time += duration
117
117
  classname = "#{@feature_name}.#{@scenario}"
118
118
  name = "#{@scenario}#{suffix}"
119
- failed = (status == :failed || (status == :pending && @options[:strict]))
120
- #puts "FAILED:!!#{failed}"
121
- if status == :passed || failed
122
- @builder.testcase(:classname => classname, :name => name, :time => "%.6f" % duration) do
123
- if failed
124
- @builder.failure(:message => "#{status.to_s} #{name}", :type => status.to_s) do
125
- @builder.text! @output
126
- @builder.text!(format_exception(exception)) if exception
127
- end
128
- @failures += 1
119
+ pending = [:pending, :undefined].include?(status)
120
+ passed = (status == :passed || (pending && !@options[:strict]))
121
+
122
+ @builder.testcase(:classname => classname, :name => name, :time => "%.6f" % duration) do
123
+ unless passed
124
+ @builder.failure(:message => "#{status.to_s} #{name}", :type => status.to_s) do
125
+ @builder.cdata! @output
126
+ @builder.cdata!(format_exception(exception)) if exception
129
127
  end
128
+ @failures += 1
129
+ end
130
+ if passed and (status == :skipped || pending)
131
+ @builder.skipped
132
+ @skipped += 1
130
133
  end
131
- @tests += 1
132
134
  end
135
+ @tests += 1
133
136
  end
134
137
 
135
138
  def format_exception(exception)
@@ -137,9 +140,12 @@ module Cucumber
137
140
  end
138
141
 
139
142
  def feature_result_filename(feature_file)
143
+ File.join(@reportdir, "TEST-#{basename(feature_file)}.xml")
144
+ end
145
+
146
+ def basename(feature_file)
140
147
  ext_length = File.extname(feature_file).length
141
- basename = File.basename(feature_file)[0...-ext_length]
142
- File.join(@reportdir, "TEST-#{basename}.xml")
148
+ feature_file.gsub('features/', '').gsub(File::SEPARATOR, '_')[0...-ext_length]
143
149
  end
144
150
 
145
151
  def write_file(feature_filename, data)
@@ -28,9 +28,9 @@ module Cucumber
28
28
  @file = ensure_file(path_or_io, "pdf")
29
29
 
30
30
  if(options[:dry_run])
31
- @status_colors = { :passed => BLACK, :skipped => BLACK, :undefined => BLACK, :failed => BLACK, :announced => GREY}
31
+ @status_colors = { :passed => BLACK, :skipped => BLACK, :undefined => BLACK, :failed => BLACK, :putsd => GREY}
32
32
  else
33
- @status_colors = { :passed => '055902', :skipped => GREY, :undefined => 'F27405', :failed => '730202', :announced => GREY}
33
+ @status_colors = { :passed => '055902', :skipped => GREY, :undefined => 'F27405', :failed => '730202', :putsd => GREY}
34
34
  end
35
35
 
36
36
  @pdf = Prawn::Document.new
@@ -71,9 +71,9 @@ module Cucumber
71
71
  end
72
72
  end
73
73
 
74
- def announce(announcement)
75
- @pdf.fill_color(@status_colors[:announced])
76
- @pdf.text announcement, :size => 10
74
+ def puts(message)
75
+ @pdf.fill_color(@status_colors[:putsd])
76
+ @pdf.text message, :size => 10
77
77
  @pdf.fill_color BLACK
78
78
  end
79
79
 
@@ -172,7 +172,7 @@ module Cucumber
172
172
  end
173
173
  end
174
174
 
175
- def before_py_string(string)
175
+ def before_doc_string(string)
176
176
  return if @hide_this_step
177
177
  s = %{"""\n#{string}\n"""}.indent(10)
178
178
  s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}