cucumber 0.8.5 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
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}