aslakhellesoy-cucumber 0.3.9.3 → 0.3.9.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +11 -0
- data/Manifest.txt +6 -0
- data/examples/i18n/pl/Rakefile +6 -0
- data/examples/i18n/pl/features/addition.feature +16 -0
- data/examples/i18n/pl/features/division.feature +9 -0
- data/examples/i18n/pl/features/step_definitons/calculator_steps.rb +24 -0
- data/examples/i18n/pl/features/support/env.rb +6 -0
- data/examples/i18n/pl/lib/calculator.rb +14 -0
- data/examples/self_test/features/sample.feature +2 -0
- data/features/cucumber_cli.feature +24 -6
- data/features/html_formatter/a.html +886 -436
- data/features/usage.feature +2 -2
- data/lib/cucumber/ast/background.rb +1 -1
- data/lib/cucumber/ast/comment.rb +4 -0
- data/lib/cucumber/ast/feature.rb +2 -1
- data/lib/cucumber/ast/outline_table.rb +2 -2
- data/lib/cucumber/ast/scenario.rb +1 -1
- data/lib/cucumber/ast/scenario_outline.rb +11 -4
- data/lib/cucumber/ast/step_invocation.rb +17 -12
- data/lib/cucumber/ast/visitor.rb +4 -0
- data/lib/cucumber/formatter/console.rb +1 -3
- data/lib/cucumber/formatter/html.rb +49 -9
- data/lib/cucumber/formatter/junit.rb +1 -0
- data/lib/cucumber/formatter/pretty.rb +2 -1
- data/lib/cucumber/formatter/rerun.rb +1 -0
- data/lib/cucumber/formatter/tag_cloud.rb +1 -0
- data/lib/cucumber/step_match.rb +6 -2
- data/lib/cucumber/step_mother.rb +11 -8
- data/lib/cucumber/version.rb +1 -1
- data/rails_generators/cucumber/templates/webrat_steps.rb +8 -0
- metadata +8 -2
data/features/usage.feature
CHANGED
@@ -113,11 +113,11 @@ Feature: Cucumber command line
|
|
113
113
|
Then the multiline string should be # features/background/multiline_args_background.feature:17
|
114
114
|
Then the multiline string should be # features/background/multiline_args_background.feature:27
|
115
115
|
/^passing$/ # features/step_definitions/sample_steps.rb:5
|
116
|
-
Given passing # features/sample.feature:
|
116
|
+
Given passing # features/sample.feature:12
|
117
117
|
/^failing expectation$/ # features/step_definitions/sample_steps.rb:62
|
118
118
|
Given failing expectation # features/failing_expectation.feature:4
|
119
119
|
/^failing$/ # features/step_definitions/sample_steps.rb:8
|
120
|
-
Given failing # features/sample.feature:
|
120
|
+
Given failing # features/sample.feature:18
|
121
121
|
(::) UNUSED (::)
|
122
122
|
/^unused$/ # features/step_definitions/sample_steps.rb:66
|
123
123
|
/^another unused$/ # features/step_definitions/sample_steps.rb:69
|
@@ -23,7 +23,7 @@ module Cucumber
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def accept(visitor)
|
26
|
-
visitor.visit_comment(@comment)
|
26
|
+
visitor.visit_comment(@comment) unless @comment.empty?
|
27
27
|
visitor.visit_background_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
|
28
28
|
visitor.step_mother.before(hook_context)
|
29
29
|
visitor.visit_steps(@step_invocations)
|
data/lib/cucumber/ast/comment.rb
CHANGED
data/lib/cucumber/ast/feature.rb
CHANGED
@@ -4,6 +4,7 @@ module Cucumber
|
|
4
4
|
class Feature
|
5
5
|
attr_accessor :file
|
6
6
|
attr_writer :features
|
7
|
+
attr_reader :name
|
7
8
|
|
8
9
|
def initialize(background, comment, tags, name, feature_elements)
|
9
10
|
@background, @comment, @tags, @name, @feature_elements = background, comment, tags, name, feature_elements
|
@@ -15,7 +16,7 @@ module Cucumber
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def accept(visitor)
|
18
|
-
visitor.visit_comment(@comment)
|
19
|
+
visitor.visit_comment(@comment) unless @comment.empty?
|
19
20
|
visitor.visit_tags(@tags)
|
20
21
|
visitor.visit_feature_name(@name)
|
21
22
|
visitor.visit_background(@background) if @background
|
@@ -70,7 +70,7 @@ module Cucumber
|
|
70
70
|
visitor.step_mother.before_and_after(self) do
|
71
71
|
@step_invocations.each do |step_invocation|
|
72
72
|
step_invocation.invoke(visitor.step_mother, visitor.options)
|
73
|
-
@exception ||= step_invocation.
|
73
|
+
@exception ||= step_invocation.reported_exception
|
74
74
|
end
|
75
75
|
|
76
76
|
@cells.each do |cell|
|
@@ -89,7 +89,7 @@ module Cucumber
|
|
89
89
|
@table.visit_scenario_name(visitor, self)
|
90
90
|
@step_invocations.each do |step_invocation|
|
91
91
|
step_invocation.invoke(visitor.step_mother, visitor.options)
|
92
|
-
@exception ||= step_invocation.
|
92
|
+
@exception ||= step_invocation.reported_exception
|
93
93
|
step_invocation.visit_step_result(visitor)
|
94
94
|
end
|
95
95
|
end
|
@@ -21,7 +21,7 @@ module Cucumber
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def accept(visitor)
|
24
|
-
visitor.visit_comment(@comment)
|
24
|
+
visitor.visit_comment(@comment) unless @comment.empty?
|
25
25
|
visitor.visit_tags(@tags)
|
26
26
|
visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
|
27
27
|
|
@@ -3,6 +3,14 @@ module Cucumber
|
|
3
3
|
class ScenarioOutline
|
4
4
|
include FeatureElement
|
5
5
|
|
6
|
+
module ExamplesArray
|
7
|
+
def accept(visitor)
|
8
|
+
each do |examples|
|
9
|
+
visitor.visit_examples(examples)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
6
14
|
# The +example_sections+ argument must be an Array where each element is another array representing
|
7
15
|
# an Examples section. This array has 3 elements:
|
8
16
|
#
|
@@ -23,20 +31,19 @@ module Cucumber
|
|
23
31
|
examples_table = OutlineTable.new(examples_matrix, self)
|
24
32
|
Examples.new(examples_line, examples_keyword, examples_name, examples_table)
|
25
33
|
end
|
34
|
+
@examples_array.extend(ExamplesArray)
|
26
35
|
|
27
36
|
@background.feature_elements << self if @background
|
28
37
|
end
|
29
38
|
|
30
39
|
def accept(visitor)
|
31
|
-
visitor.visit_comment(@comment)
|
40
|
+
visitor.visit_comment(@comment) unless @comment.empty?
|
32
41
|
visitor.visit_tags(@tags)
|
33
42
|
visitor.visit_scenario_name(@keyword, @name, file_colon_line(@line), source_indent(first_line_length))
|
34
43
|
visitor.visit_steps(@steps)
|
35
44
|
|
36
45
|
skip_invoke! if @background && @background.failed?
|
37
|
-
@examples_array
|
38
|
-
visitor.visit_examples(examples)
|
39
|
-
end
|
46
|
+
visitor.visit_examples_array(@examples_array) unless @examples_array.empty?
|
40
47
|
end
|
41
48
|
|
42
49
|
def skip_invoke!
|
@@ -2,7 +2,7 @@ module Cucumber
|
|
2
2
|
module Ast
|
3
3
|
class StepInvocation
|
4
4
|
attr_writer :step_collection, :background
|
5
|
-
attr_reader :name, :matched_cells, :status
|
5
|
+
attr_reader :name, :matched_cells, :status, :reported_exception
|
6
6
|
attr_accessor :exception
|
7
7
|
|
8
8
|
def initialize(step, name, multiline_arg, matched_cells)
|
@@ -24,12 +24,12 @@ module Cucumber
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def visit_step_result(visitor)
|
27
|
-
visitor.visit_step_result(keyword, @step_match, @multiline_arg, @status, @
|
27
|
+
visitor.visit_step_result(keyword, @step_match, @multiline_arg, @status, @reported_exception, source_indent, @background)
|
28
28
|
end
|
29
29
|
|
30
30
|
def invoke(step_mother, options)
|
31
31
|
find_step_match!(step_mother)
|
32
|
-
unless @skip_invoke || options[:dry_run] || exception || @step_collection.exception
|
32
|
+
unless @skip_invoke || options[:dry_run] || @exception || @step_collection.exception
|
33
33
|
@skip_invoke = true
|
34
34
|
begin
|
35
35
|
step_mother.current_world.__cucumber_current_step = self if step_mother.current_world # Nil in Pure Java
|
@@ -37,13 +37,13 @@ module Cucumber
|
|
37
37
|
step_mother.after_step
|
38
38
|
status!(:passed)
|
39
39
|
rescue Pending => e
|
40
|
-
failed(e, false)
|
40
|
+
failed(options, e, false)
|
41
41
|
status!(:pending)
|
42
42
|
rescue Undefined => e
|
43
|
-
failed(e, false)
|
43
|
+
failed(options, e, false)
|
44
44
|
status!(:undefined)
|
45
45
|
rescue Exception => e
|
46
|
-
failed(e, false)
|
46
|
+
failed(options, e, false)
|
47
47
|
status!(:failed)
|
48
48
|
end
|
49
49
|
end
|
@@ -54,21 +54,26 @@ module Cucumber
|
|
54
54
|
begin
|
55
55
|
@step_match = step_mother.step_match(@name)
|
56
56
|
rescue Undefined => e
|
57
|
-
failed(e, true)
|
57
|
+
failed(step_mother.options, e, true)
|
58
58
|
status!(:undefined)
|
59
59
|
@step_match = NoStepMatch.new(@step, @name)
|
60
60
|
rescue Ambiguous => e
|
61
|
-
failed(e, false)
|
61
|
+
failed(step_mother.options, e, false)
|
62
62
|
status!(:failed)
|
63
63
|
@step_match = NoStepMatch.new(@step, @name)
|
64
64
|
end
|
65
65
|
step_mother.step_visited(self)
|
66
66
|
end
|
67
67
|
|
68
|
-
def failed(
|
69
|
-
|
70
|
-
@
|
71
|
-
@exception
|
68
|
+
def failed(options, e, clear_backtrace)
|
69
|
+
e.set_backtrace([]) if clear_backtrace
|
70
|
+
e.backtrace << @step.backtrace_line unless @step.backtrace_line.nil?
|
71
|
+
@exception = e
|
72
|
+
if(options[:strict] || !(Undefined === e) || e.nested?)
|
73
|
+
@reported_exception = e
|
74
|
+
else
|
75
|
+
@reported_exception = nil
|
76
|
+
end
|
72
77
|
end
|
73
78
|
|
74
79
|
def status!(status)
|
data/lib/cucumber/ast/visitor.rb
CHANGED
@@ -66,9 +66,7 @@ module Cucumber
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def print_exception(e, status, indent)
|
69
|
-
|
70
|
-
@io.puts(format_string("#{e.message} (#{e.class})\n#{e.backtrace.join("\n")}".indent(indent), status))
|
71
|
-
end
|
69
|
+
@io.puts(format_string("#{e.message} (#{e.class})\n#{e.backtrace.join("\n")}".indent(indent), status))
|
72
70
|
end
|
73
71
|
|
74
72
|
def print_snippets(options)
|
@@ -15,6 +15,7 @@ module Cucumber
|
|
15
15
|
|
16
16
|
def initialize(step_mother, io, options)
|
17
17
|
super(step_mother)
|
18
|
+
@options = options
|
18
19
|
@builder = Builder::XmlMarkup.new(:target => io, :indent => 2)
|
19
20
|
end
|
20
21
|
|
@@ -42,7 +43,18 @@ module Cucumber
|
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
46
|
+
def visit_comment(comment)
|
47
|
+
@builder.pre(:class => 'comment') do
|
48
|
+
super
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def visit_comment_line(comment_line)
|
53
|
+
@builder.text!(comment_line.strip + "\n")
|
54
|
+
end
|
55
|
+
|
45
56
|
def visit_feature(feature)
|
57
|
+
@exceptions = []
|
46
58
|
@builder.div(:class => 'feature') do
|
47
59
|
super
|
48
60
|
end
|
@@ -54,7 +66,9 @@ module Cucumber
|
|
54
66
|
|
55
67
|
def visit_feature_name(name)
|
56
68
|
lines = name.split(/\r?\n/)
|
57
|
-
@builder.h2
|
69
|
+
@builder.h2 do |h2|
|
70
|
+
@builder.span(lines[0], :class => 'val')
|
71
|
+
end
|
58
72
|
@builder.p do
|
59
73
|
lines[1..-1].each do |line|
|
60
74
|
@builder.text!(line.strip)
|
@@ -65,17 +79,26 @@ module Cucumber
|
|
65
79
|
|
66
80
|
def visit_background(background)
|
67
81
|
@builder.div(:class => 'background') do
|
82
|
+
@in_background = true
|
68
83
|
super
|
84
|
+
@in_background = nil
|
69
85
|
end
|
70
86
|
end
|
71
87
|
|
72
88
|
def visit_background_name(keyword, name, file_colon_line, source_indent)
|
73
89
|
@listing_background = true
|
74
|
-
@builder.h3
|
90
|
+
@builder.h3 do |h3|
|
91
|
+
@builder.span(keyword, :class => 'keyword')
|
92
|
+
@builder.span(name, :class => 'val')
|
93
|
+
end
|
75
94
|
end
|
76
95
|
|
77
96
|
def visit_feature_element(feature_element)
|
78
|
-
|
97
|
+
css_class = {
|
98
|
+
Ast::Scenario => 'scenario',
|
99
|
+
Ast::ScenarioOutline => 'scenario outline'
|
100
|
+
}[feature_element.class]
|
101
|
+
@builder.div(:class => css_class) do
|
79
102
|
super
|
80
103
|
end
|
81
104
|
@open_step_list = true
|
@@ -83,7 +106,10 @@ module Cucumber
|
|
83
106
|
|
84
107
|
def visit_scenario_name(keyword, name, file_colon_line, source_indent)
|
85
108
|
@listing_background = false
|
86
|
-
@builder.h3
|
109
|
+
@builder.h3 do
|
110
|
+
@builder.span(keyword, :class => 'keyword')
|
111
|
+
@builder.span(name, :class => 'val')
|
112
|
+
end
|
87
113
|
end
|
88
114
|
|
89
115
|
def visit_outline_table(outline_table)
|
@@ -94,6 +120,12 @@ module Cucumber
|
|
94
120
|
@outline_row = nil
|
95
121
|
end
|
96
122
|
|
123
|
+
def visit_examples(examples)
|
124
|
+
@builder.div(:class => 'examples') do
|
125
|
+
super(examples)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
97
129
|
def visit_examples_name(keyword, name)
|
98
130
|
@builder.h4("#{keyword} #{name}")
|
99
131
|
end
|
@@ -110,6 +142,11 @@ module Cucumber
|
|
110
142
|
end
|
111
143
|
|
112
144
|
def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
|
145
|
+
if exception
|
146
|
+
return if @exceptions.index(exception)
|
147
|
+
@exceptions << exception
|
148
|
+
end
|
149
|
+
return if status != :failed && @in_background ^ background
|
113
150
|
@status = status
|
114
151
|
@builder.li(:id => @step_id, :class => "step #{status}") do
|
115
152
|
super(keyword, step_match, multiline_arg, status, exception, source_indent, background)
|
@@ -143,7 +180,7 @@ module Cucumber
|
|
143
180
|
end
|
144
181
|
|
145
182
|
def visit_py_string(string)
|
146
|
-
@builder.pre(:class =>
|
183
|
+
@builder.pre(:class => 'val') do |pre|
|
147
184
|
pre << string
|
148
185
|
end
|
149
186
|
end
|
@@ -168,8 +205,8 @@ module Cucumber
|
|
168
205
|
|
169
206
|
def visit_table_cell_value(value, width, status)
|
170
207
|
cell_type = @outline_row == 0 ? :th : :td
|
171
|
-
attributes = {:id => "#{@row_id}_#{@col_index}"}
|
172
|
-
attributes[:class]
|
208
|
+
attributes = {:id => "#{@row_id}_#{@col_index}", :class => 'val'}
|
209
|
+
attributes[:class] += " #{status}" if status
|
173
210
|
build_cell(cell_type, value, attributes)
|
174
211
|
@col_index += 1
|
175
212
|
end
|
@@ -181,9 +218,12 @@ module Cucumber
|
|
181
218
|
protected
|
182
219
|
|
183
220
|
def build_step(keyword, step_match, status)
|
184
|
-
step_name = step_match.format_args(lambda{|param| %{<span class="
|
221
|
+
step_name = step_match.format_args(lambda{|param| %{<span class="param">#{param}</span>}})
|
185
222
|
@builder.div do |div|
|
186
|
-
|
223
|
+
@builder.span(keyword, :class => 'keyword')
|
224
|
+
@builder.span(:class => 'step val') do |name|
|
225
|
+
name << h(step_name).gsub(/<span class="(.*?)">/, '<span class="\1">').gsub(/<\/span>/, '</span>')
|
226
|
+
end
|
187
227
|
end
|
188
228
|
end
|
189
229
|
|
@@ -12,6 +12,7 @@ module Cucumber
|
|
12
12
|
def initialize(step_mother, io, options)
|
13
13
|
super(step_mother)
|
14
14
|
@reportdir = io
|
15
|
+
@options = options
|
15
16
|
raise "You *must* specify --out DIR for the junit formatter" unless @reportdir
|
16
17
|
raise "Use --out DIR (not --out FILE) for the junit formatter" if File === @reportdir
|
17
18
|
end
|
@@ -18,8 +18,8 @@ module Cucumber
|
|
18
18
|
@io = io
|
19
19
|
@options = options
|
20
20
|
@delim = delim
|
21
|
-
@indent = 0
|
22
21
|
@exceptions = []
|
22
|
+
@indent = 0
|
23
23
|
end
|
24
24
|
|
25
25
|
def visit_features(features)
|
@@ -28,6 +28,7 @@ module Cucumber
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def visit_feature(feature)
|
31
|
+
@exceptions = []
|
31
32
|
@indent = 0
|
32
33
|
if @options[:autoformat]
|
33
34
|
file = File.join(@options[:autoformat], feature.file)
|
data/lib/cucumber/step_match.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
module Cucumber
|
2
2
|
class StepMatch
|
3
|
-
attr_reader :step_definition, :args
|
3
|
+
attr_reader :step_definition, :args
|
4
4
|
|
5
5
|
def initialize(step_definition, step_name, formatted_step_name, args)
|
6
6
|
@step_definition, @step_name, @formatted_step_name, @args = step_definition, step_name, formatted_step_name, args
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
|
+
def name
|
10
|
+
@formatted_step_name
|
11
|
+
end
|
12
|
+
|
9
13
|
def invoke(world, multiline_arg)
|
10
14
|
all_args = @args.dup
|
11
15
|
all_args << multiline_arg if multiline_arg
|
data/lib/cucumber/step_mother.rb
CHANGED
@@ -100,6 +100,10 @@ module Cucumber
|
|
100
100
|
|
101
101
|
attr_writer :snippet_generator, :options, :visitor
|
102
102
|
|
103
|
+
def options
|
104
|
+
@options ||= {}
|
105
|
+
end
|
106
|
+
|
103
107
|
def step_visited(step)
|
104
108
|
steps << step unless steps.index(step)
|
105
109
|
end
|
@@ -235,6 +239,13 @@ module Cucumber
|
|
235
239
|
end
|
236
240
|
end
|
237
241
|
|
242
|
+
def clear!
|
243
|
+
step_definitions.clear
|
244
|
+
hooks.clear
|
245
|
+
steps.clear
|
246
|
+
scenarios.clear
|
247
|
+
end
|
248
|
+
|
238
249
|
def step_definitions
|
239
250
|
@step_definitions ||= []
|
240
251
|
end
|
@@ -274,10 +285,6 @@ module Cucumber
|
|
274
285
|
@max_step_definition_length ||= step_definitions.map{|step_definition| step_definition.text_length}.max
|
275
286
|
end
|
276
287
|
|
277
|
-
def options
|
278
|
-
@options || {}
|
279
|
-
end
|
280
|
-
|
281
288
|
# Creates a new world instance
|
282
289
|
def new_world!
|
283
290
|
return if options[:dry_run]
|
@@ -351,9 +358,5 @@ module Cucumber
|
|
351
358
|
def scenario_visited(scenario)
|
352
359
|
scenarios << scenario unless scenarios.index(scenario)
|
353
360
|
end
|
354
|
-
|
355
|
-
def options
|
356
|
-
@options || {}
|
357
|
-
end
|
358
361
|
end
|
359
362
|
end
|