kosmas58-cucumber 0.2.2.1 → 0.2.3.3

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 (101) hide show
  1. data/History.txt +57 -5
  2. data/Manifest.txt +21 -4
  3. data/bin/cucumber +1 -1
  4. data/config/hoe.rb +2 -2
  5. data/examples/i18n/Rakefile +6 -8
  6. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -1
  7. data/examples/i18n/ar/lib/calculator.rb +1 -0
  8. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
  9. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +1 -1
  10. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +1 -1
  11. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +1 -1
  12. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
  13. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
  14. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
  15. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +1 -1
  16. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
  17. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +1 -1
  18. data/examples/i18n/ko/features/addition.feature +1 -1
  19. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  20. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +1 -1
  21. data/examples/i18n/no/features/support/env.rb +1 -1
  22. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
  23. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
  24. data/examples/i18n/ru/features/support/env.rb +1 -1
  25. data/examples/i18n/ru/features/support/world.rb +4 -3
  26. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
  27. data/examples/i18n/sk/Rakefile +6 -0
  28. data/examples/i18n/sk/features/addition.feature +16 -0
  29. data/examples/i18n/sk/features/division.feature +9 -0
  30. data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
  31. data/examples/i18n/sk/lib/calculator.rb +14 -0
  32. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +1 -1
  33. data/examples/i18n/zh-TW/features/step_definitons/calculator_steps.rb +1 -1
  34. data/examples/self_test/features/background/background_with_name.feature +7 -0
  35. data/examples/self_test/features/step_definitions/sample_steps.rb +8 -2
  36. data/examples/self_test/features/undefined_multiline_args.feature +12 -0
  37. data/examples/sinatra/features/support/env.rb +2 -6
  38. data/examples/test_unit/features/step_definitions/test_unit_steps.rb +1 -4
  39. data/examples/tickets/Rakefile +1 -1
  40. data/examples/tickets/features/246.feature +4 -0
  41. data/examples/tickets/features/270/back.feature +14 -0
  42. data/examples/tickets/features/270/back.steps.rb +14 -0
  43. data/examples/tickets/features/step_definitons/246_steps.rb +3 -0
  44. data/features/background.feature +21 -4
  45. data/features/cucumber_cli.feature +18 -5
  46. data/features/cucumber_cli_outlines.feature +5 -2
  47. data/features/snippet.feature +23 -0
  48. data/features/step_definitions/cucumber_steps.rb +6 -2
  49. data/features/usage.feature +5 -0
  50. data/gem_tasks/rspec.rake +3 -2
  51. data/lib/cucumber/ast/background.rb +3 -3
  52. data/lib/cucumber/ast/examples.rb +0 -12
  53. data/lib/cucumber/ast/feature.rb +2 -12
  54. data/lib/cucumber/ast/feature_element.rb +0 -8
  55. data/lib/cucumber/ast/features.rb +1 -1
  56. data/lib/cucumber/ast/outline_table.rb +14 -22
  57. data/lib/cucumber/ast/py_string.rb +6 -11
  58. data/lib/cucumber/ast/scenario.rb +1 -8
  59. data/lib/cucumber/ast/scenario_outline.rb +1 -11
  60. data/lib/cucumber/ast/step.rb +3 -9
  61. data/lib/cucumber/ast/step_collection.rb +0 -4
  62. data/lib/cucumber/ast/step_invocation.rb +5 -6
  63. data/lib/cucumber/ast/table.rb +26 -22
  64. data/lib/cucumber/ast/tags.rb +0 -8
  65. data/lib/cucumber/ast/visitor.rb +12 -25
  66. data/lib/cucumber/cli/configuration.rb +2 -2
  67. data/lib/cucumber/cli/main.rb +5 -2
  68. data/lib/cucumber/core_ext/instance_exec.rb +17 -4
  69. data/lib/cucumber/formatter/ansicolor.rb +10 -2
  70. data/lib/cucumber/formatter/console.rb +2 -1
  71. data/lib/cucumber/formatter/html.rb +21 -7
  72. data/lib/cucumber/formatter/pretty.rb +27 -20
  73. data/lib/cucumber/formatter/usage.rb +16 -0
  74. data/lib/cucumber/languages.yml +68 -7
  75. data/lib/cucumber/parser/feature.rb +238 -135
  76. data/lib/cucumber/parser/feature.tt +117 -22
  77. data/lib/cucumber/parser/i18n.tt +4 -0
  78. data/lib/cucumber/parser/table.rb +37 -25
  79. data/lib/cucumber/parser/table.tt +15 -3
  80. data/lib/cucumber/parser/treetop_ext.rb +48 -9
  81. data/lib/cucumber/parser.rb +2 -7
  82. data/lib/cucumber/step_definition.rb +13 -14
  83. data/lib/cucumber/step_mother.rb +93 -11
  84. data/lib/cucumber/version.rb +2 -2
  85. data/rails_generators/cucumber/templates/env.rb +1 -1
  86. data/rails_generators/cucumber/templates/paths.rb +15 -5
  87. data/rails_generators/cucumber/templates/webrat_steps.rb +8 -0
  88. data/spec/cucumber/ast/background_spec.rb +1 -0
  89. data/spec/cucumber/ast/feature_factory.rb +1 -1
  90. data/spec/cucumber/ast/feature_spec.rb +2 -2
  91. data/spec/cucumber/ast/scenario_spec.rb +0 -27
  92. data/spec/cucumber/ast/table_spec.rb +23 -2
  93. data/spec/cucumber/core_ext/proc_spec.rb +25 -8
  94. data/spec/cucumber/parser/feature_parser_spec.rb +43 -41
  95. data/spec/cucumber/step_definition_spec.rb +8 -0
  96. data/spec/cucumber/step_mother_spec.rb +48 -0
  97. data/spec/spec_helper.rb +2 -11
  98. metadata +17 -6
  99. data/examples/tickets/cucumber.yml +0 -3
  100. data/lib/cucumber/parser/basic.rb +0 -0
  101. data/spec/cucumber/ast/tags_spec.rb +0 -19
@@ -12,6 +12,10 @@ module Cucumber
12
12
 
13
13
  attr_accessor :file
14
14
 
15
+ def self.default_arg_name
16
+ "table"
17
+ end
18
+
15
19
  def initialize(raw, conversions = NULL_CONVERSIONS.dup)
16
20
  # Verify that it's square
17
21
  raw.transpose
@@ -60,6 +64,23 @@ module Cucumber
60
64
  row.to_hash
61
65
  end
62
66
  end
67
+
68
+ # Converts this table into a Hash where the first column is
69
+ # used as keys and the second column is used as values
70
+ #
71
+ # | a | 2 |
72
+ # | b | 3 |
73
+ #
74
+ # Gets converted into the following:
75
+ #
76
+ # {'a' => '2', 'b' => '3'}
77
+ #
78
+ # The table must be exactly two columns wide
79
+ #
80
+ def rows_hash
81
+ verify_table_width(2)
82
+ @rows_hash = self.transpose.hashes[0]
83
+ end
63
84
 
64
85
  # Gets the raw data of this table. For example, a Table built from
65
86
  # the following plain text:
@@ -84,10 +105,6 @@ module Cucumber
84
105
  cells_rows.each(&proc)
85
106
  end
86
107
 
87
- def matches_lines?(lines)
88
- cells_rows.detect{|row| row.matches_lines?(lines)}
89
- end
90
-
91
108
  def accept(visitor)
92
109
  cells_rows.each do |row|
93
110
  visitor.visit_table_row(row)
@@ -95,12 +112,6 @@ module Cucumber
95
112
  nil
96
113
  end
97
114
 
98
- def status=(status)
99
- cells_rows.each do |row|
100
- row.status = status
101
- end
102
- end
103
-
104
115
  # For testing only
105
116
  def to_sexp #:nodoc:
106
117
  [:table, *cells_rows.map{|row| row.to_sexp}]
@@ -160,6 +171,10 @@ module Cucumber
160
171
  def verify_column(column_name)
161
172
  raise %{The column named "#{column_name}" does not exist} unless @raw[0].include?(column_name)
162
173
  end
174
+
175
+ def verify_table_width(width)
176
+ raise %{The table must have exactly #{width} columns} unless @raw[0].size == width
177
+ end
163
178
 
164
179
  def arguments_replaced(arguments) #:nodoc:
165
180
  raw_with_replaced_args = raw.map do |row|
@@ -232,10 +247,6 @@ module Cucumber
232
247
  @table, @cells = table, cells
233
248
  end
234
249
 
235
- def matches_lines?(lines)
236
- lines.index(line)
237
- end
238
-
239
250
  def accept(visitor)
240
251
  each do |cell|
241
252
  visitor.visit_table_cell(cell)
@@ -245,7 +256,7 @@ module Cucumber
245
256
 
246
257
  # For testing only
247
258
  def to_sexp #:nodoc:
248
- [:row, *@cells.map{|cell| cell.to_sexp}]
259
+ [:row, line, *@cells.map{|cell| cell.to_sexp}]
249
260
  end
250
261
 
251
262
  def to_hash #:nodoc:
@@ -268,12 +279,6 @@ module Cucumber
268
279
  "row_#{line}"
269
280
  end
270
281
 
271
- def status=(status)
272
- each do |cell|
273
- cell.status = status
274
- end
275
- end
276
-
277
282
  private
278
283
 
279
284
  def index
@@ -295,7 +300,6 @@ module Cucumber
295
300
 
296
301
  def initialize(value, table, row, col, line)
297
302
  @value, @table, @row, @col, @line = value, table, row, col, line
298
- @status = :passed
299
303
  end
300
304
 
301
305
  def accept(visitor)
@@ -11,14 +11,6 @@ module Cucumber
11
11
  @line, @tag_names = line, tag_names
12
12
  end
13
13
 
14
- def has_tags?(tags)
15
- (@tag_names & tags).any?
16
- end
17
-
18
- def matches_lines?(lines)
19
- lines.index(@line)
20
- end
21
-
22
14
  def accept(visitor)
23
15
  @tag_names.each do |tag_name|
24
16
  visitor.visit_tag_name(tag_name)
@@ -8,25 +8,6 @@ module Cucumber
8
8
  def initialize(step_mother)
9
9
  @options = {}
10
10
  @step_mother = step_mother
11
- @current_feature_lines = []
12
- end
13
-
14
- def current_feature_lines=(lines)
15
- @current_feature_lines = lines
16
- end
17
-
18
- def matches_lines?(node)
19
- @current_feature_lines.empty? || node.matches_lines?(@current_feature_lines)
20
- end
21
-
22
- def included_by_tags?(node)
23
- tags = options[:include_tags] || []
24
- tags.empty? || node.has_tags?(tags)
25
- end
26
-
27
- def excluded_by_tags?(node)
28
- tags = options[:exclude_tags] || []
29
- tags.any? && node.has_tags?(tags)
30
11
  end
31
12
 
32
13
  def matches_scenario_names?(node)
@@ -93,14 +74,23 @@ module Cucumber
93
74
  step.accept(self)
94
75
  end
95
76
 
96
- def visit_step_name(keyword, step_match, status, source_indent, background)
77
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
78
+ visit_step_name(keyword, step_match, status, source_indent, background)
79
+ visit_multiline_arg(multiline_arg) if multiline_arg
80
+ visit_exception(exception, status) if exception
81
+ end
82
+
83
+ def visit_step_name(keyword, step_match, status, source_indent, background) #:nodoc:
97
84
  end
98
85
 
99
- def visit_multiline_arg(multiline_arg)
86
+ def visit_multiline_arg(multiline_arg) #:nodoc:
100
87
  multiline_arg.accept(self)
101
88
  end
102
89
 
103
- def visit_py_string(string, status)
90
+ def visit_exception(exception, status) #:nodoc:
91
+ end
92
+
93
+ def visit_py_string(string)
104
94
  end
105
95
 
106
96
  def visit_table_row(table_row)
@@ -114,9 +104,6 @@ module Cucumber
114
104
  def visit_table_cell_value(value, width, status)
115
105
  end
116
106
 
117
- def visit_exception(exception, status)
118
- end
119
-
120
107
  def announce(announcement)
121
108
  end
122
109
 
@@ -257,11 +257,11 @@ module Cucumber
257
257
 
258
258
  potential_feature_files
259
259
  end
260
-
260
+
261
261
  protected
262
262
 
263
263
  def feature_dirs
264
- feature_files.map { |f| File.directory?(f) ? f : File.dirname(f) }.uniq
264
+ @paths.map { |f| File.directory?(f) ? f : File.dirname(f) }.uniq
265
265
  end
266
266
 
267
267
  def constantize(camel_cased_word)
@@ -52,8 +52,11 @@ module Cucumber
52
52
 
53
53
  verbose_log("Features:")
54
54
  configuration.feature_files.each do |f|
55
- features.add_feature(parser.parse_file(f))
56
- verbose_log(" * #{f}")
55
+ feature = parser.parse_file(f, configuration.options)
56
+ if feature
57
+ features.add_feature(feature)
58
+ verbose_log(" * #{f}")
59
+ end
57
60
  end
58
61
  verbose_log("\n"*2)
59
62
  features
@@ -7,12 +7,14 @@ end
7
7
 
8
8
  class Object
9
9
  def cucumber_instance_exec(check_arity, pseudo_method, *args, &block)
10
- arity = block.arity
11
- arity = 0 if arity == -1
12
10
  cucumber_run_with_backtrace_filtering(pseudo_method) do
13
- if check_arity && args.length != arity
11
+ if check_arity && !cucumber_compatible_arity?(args, block)
14
12
  instance_exec do
15
- raise Cucumber::ArityMismatchError.new("expected #{arity} block argument(s), got #{args.length}")
13
+ s1 = cucumber_arity(block) == 1 ? "" : "s"
14
+ s2 = args.length == 1 ? "" : "s"
15
+ raise Cucumber::ArityMismatchError.new(
16
+ "Your block takes #{cucumber_arity(block)} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
17
+ )
16
18
  end
17
19
  else
18
20
  instance_exec(*args, &block)
@@ -20,6 +22,17 @@ class Object
20
22
  end
21
23
  end
22
24
 
25
+ def cucumber_arity(block)
26
+ a = block.arity
27
+ Cucumber::RUBY_1_9 ? a : (a == -1 ? 0 : a)
28
+ end
29
+
30
+ def cucumber_compatible_arity?(args, block)
31
+ a = cucumber_arity(block)
32
+ return true if (a == -1) && Cucumber::RUBY_1_9
33
+ a == args.length
34
+ end
35
+
23
36
  def cucumber_run_with_backtrace_filtering(pseudo_method)
24
37
  begin
25
38
  yield
@@ -6,12 +6,20 @@ if Cucumber::WINDOWS_MRI
6
6
  gem 'win32console', '>= 1.2.0'
7
7
  require 'Win32/Console/ANSI'
8
8
  rescue LoadError
9
- STDERR.puts "*** WARNING: You must gem install win32console (1.2.0 or higher) to get coloured output on MRI/Windows"
9
+ STDERR.puts %{*** WARNING: You must "gem install win32console" (1.2.0 or higher) to get coloured output on MRI/Windows}
10
+ Term::ANSIColor.coloring = false
11
+ end
12
+ elsif Cucumber::WINDOWS && Cucumber::JRUBY
13
+ begin
14
+ gem 'aslakhellesoy-ansicolor', '>= 1.0'
15
+ require 'ansicolor'
16
+ rescue LoadError
17
+ STDERR.puts %{*** WARNING: You must "gem install aslakhellesoy-ansicolor --source http://gems.github.com" (1.0 or higher) to get coloured output on JRuby/Windows}
10
18
  Term::ANSIColor.coloring = false
11
19
  end
12
20
  end
13
21
 
14
- Term::ANSIColor.coloring = false if !STDOUT.tty? || (Cucumber::WINDOWS && !Cucumber::WINDOWS_MRI)
22
+ Term::ANSIColor.coloring = false if !STDOUT.tty?
15
23
 
16
24
  module Cucumber
17
25
  module Formatter
@@ -74,7 +74,8 @@ module Cucumber
74
74
  return if undefined.empty?
75
75
  snippets = undefined.map do |step|
76
76
  step_name = Undefined === step.exception ? step.exception.step_name : step.name
77
- snippet = @step_mother.snippet_text(step.actual_keyword, step_name)
77
+ step_multiline_class = step.multiline_arg ? step.multiline_arg.class : nil
78
+ snippet = @step_mother.snippet_text(step.actual_keyword, step_name, step_multiline_class)
78
79
  snippet
79
80
  end.compact.uniq
80
81
 
@@ -1,3 +1,4 @@
1
+ require 'erb'
1
2
  begin
2
3
  require 'builder'
3
4
  rescue LoadError
@@ -8,6 +9,8 @@ end
8
9
  module Cucumber
9
10
  module Formatter
10
11
  class Html < Ast::Visitor
12
+ include ERB::Util # for the #h method
13
+
11
14
  def initialize(step_mother, io, options)
12
15
  super(step_mother)
13
16
  @builder = Builder::XmlMarkup.new(:target => io, :indent => 2)
@@ -74,9 +77,11 @@ module Cucumber
74
77
  end
75
78
 
76
79
  def visit_outline_table(outline_table)
80
+ @outline_row = 0
77
81
  @builder.table do
78
82
  super(outline_table)
79
83
  end
84
+ @outline_row = nil
80
85
  end
81
86
 
82
87
  def visit_examples_name(keyword, name)
@@ -91,8 +96,13 @@ module Cucumber
91
96
 
92
97
  def visit_step(step)
93
98
  @step_id = step.dom_id
94
- @builder.li(:id => @step_id) do
95
- super
99
+ super
100
+ end
101
+
102
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
103
+ @status = status
104
+ @builder.li(:id => @step_id, :class => status) do
105
+ super(keyword, step_match, multiline_arg, status, exception, source_indent, background)
96
106
  end
97
107
  end
98
108
 
@@ -103,8 +113,8 @@ module Cucumber
103
113
 
104
114
  unless @skip_step
105
115
  step_name = step_match.format_args(lambda{|param| "<span>#{param}</span>"})
106
- @builder.div(:class => status) do |div|
107
- div << "#{keyword} #{step_name}"
116
+ @builder.div do |div|
117
+ div << h("#{keyword} #{step_name}")
108
118
  end
109
119
  end
110
120
  end
@@ -124,8 +134,8 @@ module Cucumber
124
134
  end
125
135
  end
126
136
 
127
- def visit_py_string(string, status)
128
- @builder.pre(:class => status) do |pre|
137
+ def visit_py_string(string)
138
+ @builder.pre(:class => @status) do |pre|
129
139
  pre << string
130
140
  end
131
141
  end
@@ -145,10 +155,14 @@ module Cucumber
145
155
  end
146
156
  end
147
157
  end
158
+ @outline_row += 1 if @outline_row
148
159
  end
149
160
 
150
161
  def visit_table_cell_value(value, width, status)
151
- @builder.td(value, :class => status, :id => "#{@row_id}_#{@col_index}")
162
+ cell_type = @outline_row == 0 ? :th : :td
163
+ attributes = {:id => "#{@row_id}_#{@col_index}"}
164
+ attributes[:class] = status if status
165
+ @builder.__send__(cell_type, value, attributes)
152
166
  @col_index += 1
153
167
  end
154
168
 
@@ -19,6 +19,7 @@ module Cucumber
19
19
  @options = options
20
20
  @delim = delim
21
21
  @indent = 0
22
+ @exceptions = []
22
23
  end
23
24
 
24
25
  def visit_features(features)
@@ -119,26 +120,33 @@ module Cucumber
119
120
  super
120
121
  end
121
122
 
122
- def visit_step_name(keyword, step_match, status, source_indent, background)
123
- @step_matches ||= []
124
- non_failed_background_step_outside_background = !@in_background && background && (status != :failed)
125
- @skip_step = @step_matches.index(step_match) || non_failed_background_step_outside_background
126
- @step_matches << step_match
127
-
128
- unless(@skip_step)
129
- source_indent = nil unless @options[:source]
130
- formatted_step_name = format_step(keyword, step_match, status, source_indent)
131
- @io.puts(" " + formatted_step_name)
123
+ def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
124
+ if exception
125
+ return if @exceptions.index(exception)
126
+ @exceptions << exception
132
127
  end
128
+ return if status != :failed && @in_background ^ background
129
+
130
+ # @step_matches ||= []
131
+ # return if @step_matches.index(step_match)
132
+ # @step_matches << step_match
133
+
134
+ @status = status
135
+ super
136
+ end
137
+
138
+ def visit_step_name(keyword, step_match, status, source_indent, background)
139
+ source_indent = nil unless @options[:source]
140
+ formatted_step_name = format_step(keyword, step_match, status, source_indent)
141
+ @io.puts(" " + formatted_step_name)
133
142
  end
134
143
 
135
144
  def visit_multiline_arg(multiline_arg)
136
- return if @options[:no_multiline] || @skip_step
145
+ return if @options[:no_multiline]
137
146
  super
138
147
  end
139
148
 
140
149
  def visit_exception(exception, status)
141
- return if @skip_step
142
150
  print_exception(exception, status, @indent)
143
151
  @io.flush
144
152
  end
@@ -147,21 +155,20 @@ module Cucumber
147
155
  @io.print @delim.indent(@indent)
148
156
  super
149
157
  @io.puts
150
- print_exception(table_row.exception, :failed, @indent) if table_row.exception
158
+ if table_row.exception && !@exceptions.index(table_row.exception)
159
+ print_exception(table_row.exception, :failed, @indent)
160
+ end
151
161
  end
152
162
 
153
- def visit_py_string(string, status)
154
- s = "\"\"\"\n#{string}\n\"\"\"".indent(@indent)
163
+ def visit_py_string(string)
164
+ s = %{"""\n#{string}\n"""}.indent(@indent)
155
165
  s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
156
- @io.puts(format_string(s, status))
166
+ @io.puts(format_string(s, @status))
157
167
  @io.flush
158
168
  end
159
169
 
160
- def visit_table_cell(table_cell)
161
- super
162
- end
163
-
164
170
  def visit_table_cell_value(value, width, status)
171
+ status ||= @status || :passed
165
172
  @io.print(' ' + format_string((value.to_s || '').ljust(width), status) + " #{@delim}")
166
173
  @io.flush
167
174
  end
@@ -10,6 +10,7 @@ module Cucumber
10
10
  @io = io
11
11
  @options = options
12
12
  @step_definitions = Hash.new { |h,step_definition| h[step_definition] = [] }
13
+ @all_step_definitions = step_mother.step_definitions.dup
13
14
  @locations = []
14
15
  end
15
16
 
@@ -32,6 +33,7 @@ module Cucumber
32
33
  description = format_step(keyword, step_match, status, nil)
33
34
  length = (keyword + step_match.format_args).jlength
34
35
  @step_definitions[step_match.step_definition] << [step_match, description, length, location]
36
+ @all_step_definitions.delete(step_match.step_definition)
35
37
  end
36
38
  end
37
39
 
@@ -63,6 +65,20 @@ module Cucumber
63
65
  @io.puts format_string(" # #{file_colon_line}".indent(max_length - length), :comment)
64
66
  end
65
67
  end
68
+
69
+ print_unused_step_definitions
70
+ end
71
+
72
+ def print_unused_step_definitions
73
+ if @all_step_definitions.any?
74
+ max_length = @all_step_definitions.map{|step_definition| step_definition.text_length}.max
75
+
76
+ @io.puts format_string("(::) UNUSED (::)", :failed)
77
+ @all_step_definitions.each do |step_definition|
78
+ @io.print format_string(step_definition.regexp.inspect, :failed)
79
+ @io.puts format_string(" # #{step_definition.file_colon_line}".indent(max_length - step_definition.text_length), :comment)
80
+ end
81
+ end
66
82
  end
67
83
  end
68
84
  end