cucumber 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +56 -1
- data/Manifest.txt +70 -49
- data/config/hoe.rb +1 -1
- data/cucumber.yml +1 -1
- data/examples/i18n/bg/Rakefile +6 -0
- data/examples/i18n/bg/features/addition.feature +11 -0
- data/examples/i18n/bg/features/consecutive_calculations.feature +18 -0
- data/examples/i18n/bg/features/division.feature +16 -0
- data/examples/i18n/bg/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/bg/features/support/env.rb +6 -0
- data/examples/i18n/bg/features/support/world.rb +8 -0
- data/examples/i18n/bg/lib/calculator.rb +24 -0
- data/examples/i18n/ru/features/support/world.rb +4 -3
- data/examples/i18n/sk/Rakefile +6 -0
- data/examples/i18n/sk/features/addition.feature +16 -0
- data/examples/i18n/sk/features/division.feature +9 -0
- data/examples/i18n/sk/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/sk/lib/calculator.rb +14 -0
- data/examples/self_test/features/background/background_with_name.feature +7 -0
- data/examples/self_test/features/background/passing_background.feature +2 -2
- data/examples/self_test/features/step_definitions/sample_steps.rb +18 -2
- data/examples/self_test/features/undefined_multiline_args.feature +12 -0
- data/examples/sinatra/features/support/env.rb +2 -6
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +1 -4
- data/examples/tickets/Rakefile +1 -1
- data/examples/tickets/features/229/tagged_hooks.feature +8 -0
- data/examples/tickets/features/229/tagged_hooks.rb +14 -0
- data/examples/tickets/features/270/back.feature +14 -0
- data/examples/tickets/features/270/back.steps.rb +14 -0
- data/examples/tickets/features/279/py_string_indent.feature +25 -0
- data/examples/tickets/features/279/py_string_indent.steps.rb +12 -0
- data/examples/tickets/features/279/wrong.feature_ +11 -0
- data/examples/tickets/features/step_definitons/tickets_steps.rb +0 -7
- data/features/background.feature +21 -3
- data/features/cucumber_cli.feature +18 -5
- data/features/cucumber_cli_outlines.feature +4 -1
- data/features/rake_task.feature +132 -0
- data/features/snippet.feature +23 -0
- data/features/step_definitions/cucumber_steps.rb +46 -15
- data/features/support/env.rb +61 -4
- data/features/usage.feature +5 -0
- data/gem_tasks/deployment.rake +1 -1
- data/lib/cucumber/ast/background.rb +14 -4
- data/lib/cucumber/ast/examples.rb +0 -12
- data/lib/cucumber/ast/feature.rb +2 -12
- data/lib/cucumber/ast/feature_element.rb +4 -8
- data/lib/cucumber/ast/features.rb +1 -1
- data/lib/cucumber/ast/outline_table.rb +20 -20
- data/lib/cucumber/ast/py_string.rb +6 -11
- data/lib/cucumber/ast/scenario.rb +1 -8
- data/lib/cucumber/ast/scenario_outline.rb +1 -11
- data/lib/cucumber/ast/step.rb +3 -9
- data/lib/cucumber/ast/step_collection.rb +0 -4
- data/lib/cucumber/ast/step_invocation.rb +5 -6
- data/lib/cucumber/ast/table.rb +5 -22
- data/lib/cucumber/ast/tags.rb +9 -9
- data/lib/cucumber/ast/visitor.rb +12 -25
- data/lib/cucumber/cli/configuration.rb +4 -4
- data/lib/cucumber/cli/main.rb +10 -3
- data/lib/cucumber/core_ext/instance_exec.rb +17 -4
- data/lib/cucumber/formatter/ansicolor.rb +1 -1
- data/lib/cucumber/formatter/console.rb +2 -1
- data/lib/cucumber/formatter/html.rb +21 -7
- data/lib/cucumber/formatter/pretty.rb +27 -20
- data/lib/cucumber/formatter/usage.rb +16 -0
- data/lib/cucumber/languages.yml +23 -5
- data/lib/cucumber/parser/feature.rb +231 -114
- data/lib/cucumber/parser/feature.tt +120 -25
- data/lib/cucumber/parser/table.rb +37 -25
- data/lib/cucumber/parser/table.tt +15 -3
- data/lib/cucumber/parser/treetop_ext.rb +48 -9
- data/lib/cucumber/rake/task.rb +29 -6
- data/lib/cucumber/step_definition.rb +4 -2
- data/lib/cucumber/step_mother.rb +143 -26
- data/lib/cucumber/version.rb +2 -2
- data/rails_generators/cucumber/templates/paths.rb +13 -4
- data/rails_generators/cucumber/templates/webrat_steps.rb +16 -0
- data/{specs → spec}/cucumber/ast/background_spec.rb +1 -0
- data/{specs → spec}/cucumber/ast/feature_factory.rb +1 -1
- data/{specs → spec}/cucumber/ast/feature_spec.rb +2 -2
- data/{specs → spec}/cucumber/ast/py_string_spec.rb +0 -0
- data/{specs → spec}/cucumber/ast/scenario_outline_spec.rb +0 -0
- data/{specs → spec}/cucumber/ast/scenario_spec.rb +0 -27
- data/{specs → spec}/cucumber/ast/step_collection_spec.rb +0 -0
- data/{specs → spec}/cucumber/ast/step_spec.rb +0 -0
- data/{specs → spec}/cucumber/ast/table_spec.rb +2 -2
- data/{specs → spec}/cucumber/broadcaster_spec.rb +0 -0
- data/{specs → spec}/cucumber/cli/configuration_spec.rb +0 -0
- data/{specs → spec}/cucumber/cli/main_spec.rb +5 -1
- data/spec/cucumber/core_ext/proc_spec.rb +54 -0
- data/{specs → spec}/cucumber/core_ext/string_spec.rb +0 -0
- data/{specs → spec}/cucumber/formatter/ansicolor_spec.rb +0 -0
- data/{specs → spec}/cucumber/formatter/color_io_spec.rb +0 -0
- data/{specs → spec}/cucumber/formatter/html/cucumber.css +0 -0
- data/{specs → spec}/cucumber/formatter/html/cucumber.js +0 -0
- data/{specs → spec}/cucumber/formatter/html/index.html +0 -0
- data/{specs → spec}/cucumber/formatter/html/jquery-1.3.min.js +0 -0
- data/{specs → spec}/cucumber/formatter/html/jquery.uitableedit.js +0 -0
- data/{specs → spec}/cucumber/formatters/profile_formatter_spec.rb +0 -0
- data/{specs → spec}/cucumber/parser/feature_parser_spec.rb +43 -41
- data/{specs → spec}/cucumber/parser/table_parser_spec.rb +0 -0
- data/{specs → spec}/cucumber/rails/stubs/mini_rails.rb +0 -0
- data/{specs → spec}/cucumber/rails/stubs/test_help.rb +0 -0
- data/{specs → spec}/cucumber/rails/world_spec.rb +0 -0
- data/{specs → spec}/cucumber/sell_cucumbers.feature +0 -0
- data/{specs → spec}/cucumber/step_definition_spec.rb +0 -0
- data/{specs → spec}/cucumber/step_mother_spec.rb +63 -4
- data/{specs → spec}/cucumber/treetop_parser/empty_feature.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/empty_scenario.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/empty_scenario_outline.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/fit_scenario.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/given_scenario.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/invalid_scenario_outlines.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/multiline_steps.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/multiple_tables.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/scenario_outline.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/spaces.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/test_dos.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/with_comments.feature +0 -0
- data/{specs → spec}/cucumber/treetop_parser/with_tags.feature +0 -0
- data/{specs → spec}/cucumber/world/pending_spec.rb +0 -0
- data/{specs → spec}/spec.opts +0 -0
- data/{specs → spec}/spec_helper.rb +2 -11
- metadata +72 -51
- data/examples/tickets/cucumber.yml +0 -3
- data/lib/cucumber/parser/basic.rb +0 -0
- data/specs/cucumber/ast/tags_spec.rb +0 -19
- data/specs/cucumber/core_ext/proc_spec.rb +0 -37
@@ -8,7 +8,7 @@ module Cucumber
|
|
8
8
|
def initialize(background, comment, tags, line, keyword, name, steps)
|
9
9
|
@background, @comment, @tags, @line, @keyword, @name = background, comment, tags, line, keyword, name
|
10
10
|
attach_steps(steps)
|
11
|
-
|
11
|
+
|
12
12
|
step_invocations = steps.map{|step| step.step_invocation}
|
13
13
|
if @background
|
14
14
|
@steps = @background.step_collection(step_invocations)
|
@@ -22,13 +22,6 @@ module Cucumber
|
|
22
22
|
@background.feature = feature if @background
|
23
23
|
end
|
24
24
|
|
25
|
-
def descend?(visitor)
|
26
|
-
visitor.matches_lines?(self) &&
|
27
|
-
visitor.included_by_tags?(self) &&
|
28
|
-
!visitor.excluded_by_tags?(self) &&
|
29
|
-
visitor.matches_scenario_names?(self)
|
30
|
-
end
|
31
|
-
|
32
25
|
def accept(visitor)
|
33
26
|
visitor.visit_comment(@comment)
|
34
27
|
visitor.visit_tags(@tags)
|
@@ -30,16 +30,6 @@ module Cucumber
|
|
30
30
|
@background.feature = feature if @background
|
31
31
|
end
|
32
32
|
|
33
|
-
def descend?(visitor)
|
34
|
-
@examples_array.detect { |examples| examples.descend?(visitor) }
|
35
|
-
end
|
36
|
-
|
37
|
-
def matches_tags_and_name?(visitor)
|
38
|
-
visitor.included_by_tags?(self) &&
|
39
|
-
!visitor.excluded_by_tags?(self) &&
|
40
|
-
visitor.matches_scenario_names?(self)
|
41
|
-
end
|
42
|
-
|
43
33
|
def accept(visitor)
|
44
34
|
visitor.visit_comment(@comment)
|
45
35
|
visitor.visit_tags(@tags)
|
@@ -48,7 +38,7 @@ module Cucumber
|
|
48
38
|
|
49
39
|
skip_invoke! if @background && @background.failed?
|
50
40
|
@examples_array.each do |examples|
|
51
|
-
visitor.visit_examples(examples)
|
41
|
+
visitor.visit_examples(examples)
|
52
42
|
end
|
53
43
|
end
|
54
44
|
|
data/lib/cucumber/ast/step.rb
CHANGED
@@ -33,13 +33,11 @@ module Cucumber
|
|
33
33
|
def accept(visitor)
|
34
34
|
# The only time a Step is visited is when it is in a ScenarioOutline.
|
35
35
|
# Otherwise it's always StepInvocation that gest visited instead.
|
36
|
-
|
36
|
+
visit_step_result(visitor, first_match(visitor), @multiline_arg, :skipped, nil, nil)
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
40
|
-
visitor.
|
41
|
-
visitor.visit_multiline_arg(@multiline_arg) if @multiline_arg
|
42
|
-
visitor.visit_exception(exception, status) if exception
|
39
|
+
def visit_step_result(visitor, step_match, multiline_arg, status, exception, background)
|
40
|
+
visitor.visit_step_result(@keyword, step_match, @multiline_arg, status, exception, source_indent, background)
|
43
41
|
end
|
44
42
|
|
45
43
|
def first_match(visitor)
|
@@ -58,10 +56,6 @@ module Cucumber
|
|
58
56
|
[:step, @line, @keyword, @name, (@multiline_arg.nil? ? nil : @multiline_arg.to_sexp)].compact
|
59
57
|
end
|
60
58
|
|
61
|
-
def matches_lines?(lines)
|
62
|
-
lines.index(@line) || (@multiline_arg && @multiline_arg.matches_lines?(lines))
|
63
|
-
end
|
64
|
-
|
65
59
|
def source_indent
|
66
60
|
@feature_element.source_indent(text_length)
|
67
61
|
end
|
@@ -20,7 +20,7 @@ module Cucumber
|
|
20
20
|
|
21
21
|
def accept(visitor)
|
22
22
|
invoke(visitor.step_mother, visitor.options)
|
23
|
-
@step.
|
23
|
+
@step.visit_step_result(visitor, @step_match, @multiline_arg, @status, @exception, @background)
|
24
24
|
end
|
25
25
|
|
26
26
|
def invoke(step_mother, options)
|
@@ -68,7 +68,6 @@ module Cucumber
|
|
68
68
|
|
69
69
|
def status!(status)
|
70
70
|
@status = status
|
71
|
-
@multiline_arg.status = status if @multiline_arg
|
72
71
|
@matched_cells.each do |cell|
|
73
72
|
cell.status = status
|
74
73
|
end
|
@@ -86,10 +85,6 @@ module Cucumber
|
|
86
85
|
end
|
87
86
|
end
|
88
87
|
|
89
|
-
def matches_lines?(lines)
|
90
|
-
@step.matches_lines?(lines)
|
91
|
-
end
|
92
|
-
|
93
88
|
def text_length
|
94
89
|
@step.text_length
|
95
90
|
end
|
@@ -98,6 +93,10 @@ module Cucumber
|
|
98
93
|
@step.keyword
|
99
94
|
end
|
100
95
|
|
96
|
+
def multiline_arg
|
97
|
+
@step.multiline_arg
|
98
|
+
end
|
99
|
+
|
101
100
|
def file_colon_line
|
102
101
|
@step.file_colon_line
|
103
102
|
end
|
data/lib/cucumber/ast/table.rb
CHANGED
@@ -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
|
@@ -101,10 +105,6 @@ module Cucumber
|
|
101
105
|
cells_rows.each(&proc)
|
102
106
|
end
|
103
107
|
|
104
|
-
def matches_lines?(lines)
|
105
|
-
cells_rows.detect{|row| row.matches_lines?(lines)}
|
106
|
-
end
|
107
|
-
|
108
108
|
def accept(visitor)
|
109
109
|
cells_rows.each do |row|
|
110
110
|
visitor.visit_table_row(row)
|
@@ -112,12 +112,6 @@ module Cucumber
|
|
112
112
|
nil
|
113
113
|
end
|
114
114
|
|
115
|
-
def status=(status)
|
116
|
-
cells_rows.each do |row|
|
117
|
-
row.status = status
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
115
|
# For testing only
|
122
116
|
def to_sexp #:nodoc:
|
123
117
|
[:table, *cells_rows.map{|row| row.to_sexp}]
|
@@ -253,10 +247,6 @@ module Cucumber
|
|
253
247
|
@table, @cells = table, cells
|
254
248
|
end
|
255
249
|
|
256
|
-
def matches_lines?(lines)
|
257
|
-
lines.index(line)
|
258
|
-
end
|
259
|
-
|
260
250
|
def accept(visitor)
|
261
251
|
each do |cell|
|
262
252
|
visitor.visit_table_cell(cell)
|
@@ -266,7 +256,7 @@ module Cucumber
|
|
266
256
|
|
267
257
|
# For testing only
|
268
258
|
def to_sexp #:nodoc:
|
269
|
-
[:row, *@cells.map{|cell| cell.to_sexp}]
|
259
|
+
[:row, line, *@cells.map{|cell| cell.to_sexp}]
|
270
260
|
end
|
271
261
|
|
272
262
|
def to_hash #:nodoc:
|
@@ -289,12 +279,6 @@ module Cucumber
|
|
289
279
|
"row_#{line}"
|
290
280
|
end
|
291
281
|
|
292
|
-
def status=(status)
|
293
|
-
each do |cell|
|
294
|
-
cell.status = status
|
295
|
-
end
|
296
|
-
end
|
297
|
-
|
298
282
|
private
|
299
283
|
|
300
284
|
def index
|
@@ -316,7 +300,6 @@ module Cucumber
|
|
316
300
|
|
317
301
|
def initialize(value, table, row, col, line)
|
318
302
|
@value, @table, @row, @col, @line = value, table, row, col, line
|
319
|
-
@status = :passed
|
320
303
|
end
|
321
304
|
|
322
305
|
def accept(visitor)
|
data/lib/cucumber/ast/tags.rb
CHANGED
@@ -7,24 +7,24 @@ module Cucumber
|
|
7
7
|
# This gets stored internally as <tt>["invoice", "release_2"]</tt>
|
8
8
|
#
|
9
9
|
class Tags
|
10
|
+
def self.strip_prefix(tag_name)
|
11
|
+
tag_name =~ /^@(.*)/ ? $1 : tag_name
|
12
|
+
end
|
13
|
+
|
10
14
|
def initialize(line, tag_names)
|
11
15
|
@line, @tag_names = line, tag_names
|
12
16
|
end
|
13
17
|
|
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
18
|
def accept(visitor)
|
23
19
|
@tag_names.each do |tag_name|
|
24
20
|
visitor.visit_tag_name(tag_name)
|
25
21
|
end
|
26
22
|
end
|
27
|
-
|
23
|
+
|
24
|
+
def accept_hook?(hook)
|
25
|
+
hook.matches_tag_names?(@tag_names)
|
26
|
+
end
|
27
|
+
|
28
28
|
def to_sexp
|
29
29
|
@tag_names.map{|tag_name| [:tag, tag_name]}
|
30
30
|
end
|
data/lib/cucumber/ast/visitor.rb
CHANGED
@@ -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
|
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
|
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
|
|
@@ -187,8 +187,8 @@ module Cucumber
|
|
187
187
|
excludes = excludes.map{|tag| tag[1..-1]}
|
188
188
|
|
189
189
|
# Strip @
|
190
|
-
includes = includes.map{|tag| tag
|
191
|
-
excludes = excludes.map{|tag| tag
|
190
|
+
includes = includes.map{|tag| Ast::Tags.strip_prefix(tag)}
|
191
|
+
excludes = excludes.map{|tag| Ast::Tags.strip_prefix(tag)}
|
192
192
|
[includes, excludes]
|
193
193
|
end
|
194
194
|
|
@@ -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
|
-
|
264
|
+
@paths.map { |f| File.directory?(f) ? f : File.dirname(f) }.uniq
|
265
265
|
end
|
266
266
|
|
267
267
|
def constantize(camel_cased_word)
|
data/lib/cucumber/cli/main.rb
CHANGED
@@ -52,8 +52,11 @@ module Cucumber
|
|
52
52
|
|
53
53
|
verbose_log("Features:")
|
54
54
|
configuration.feature_files.each do |f|
|
55
|
-
|
56
|
-
|
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
|
@@ -89,7 +92,11 @@ module Cucumber
|
|
89
92
|
|
90
93
|
def enable_diffing
|
91
94
|
if configuration.diff_enabled? && defined?(::Spec)
|
92
|
-
|
95
|
+
begin
|
96
|
+
require 'spec/runner/differs/default' # RSpec >=1.2.4
|
97
|
+
rescue ::LoadError
|
98
|
+
require 'spec/expectations/differs/default' # RSpec <=1.2.3
|
99
|
+
end
|
93
100
|
options = OpenStruct.new(:diff_format => :unified, :context_lines => 3)
|
94
101
|
::Spec::Expectations.differ = ::Spec::Expectations::Differs::Default.new(options)
|
95
102
|
end
|
@@ -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
|
11
|
+
if check_arity && !cucumber_compatible_arity?(args, block)
|
14
12
|
instance_exec do
|
15
|
-
|
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
|
@@ -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
|
-
|
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
|
-
|
95
|
-
|
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
|
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
|
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
|
-
@
|
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
|
|