cucumber 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +53 -0
- data/Manifest.txt +4 -0
- data/Rakefile +1 -0
- data/examples/calculator/cucumber.yml +1 -1
- data/examples/dos_line_endings/Rakefile +6 -0
- data/examples/dos_line_endings/features/dos_line_endings.feature +9 -0
- data/examples/tickets/features/steps/tickets_steps.rb +13 -1
- data/examples/tickets/features/tickets.feature +5 -1
- data/gem_tasks/treetop.rake +10 -0
- data/generators/cucumber/templates/common_webrat.rb +1 -1
- data/lib/cucumber.rb +3 -1
- data/lib/cucumber/cli.rb +16 -15
- data/lib/cucumber/core_ext/proc.rb +11 -2
- data/lib/cucumber/executor.rb +32 -15
- data/lib/cucumber/formatters/ansicolor.rb +25 -3
- data/lib/cucumber/formatters/pretty_formatter.rb +44 -15
- data/lib/cucumber/languages.yml +10 -0
- data/lib/cucumber/step_methods.rb +8 -4
- data/lib/cucumber/step_mother.rb +4 -3
- data/lib/cucumber/tree/scenario.rb +22 -10
- data/lib/cucumber/tree/step.rb +9 -1
- data/lib/cucumber/treetop_parser/feature.treetop.erb +5 -5
- data/lib/cucumber/treetop_parser/feature_da.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_de.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_en.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_es.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_et.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_fr.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_no.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_parser.rb +4 -2
- data/lib/cucumber/treetop_parser/feature_pt.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_ru.rb +146 -108
- data/lib/cucumber/treetop_parser/feature_se.rb +146 -108
- data/lib/cucumber/version.rb +1 -1
- data/spec/cucumber/cli_spec.rb +14 -4
- data/spec/cucumber/executor_spec.rb +4 -3
- data/spec/cucumber/formatters/ansicolor_spec.rb +4 -0
- data/spec/cucumber/formatters/pretty_formatter_spec.rb +67 -2
- data/spec/cucumber/tree/scenario_spec.rb +2 -2
- data/spec/cucumber/tree/step_spec.rb +21 -0
- data/spec/cucumber/treetop_parser/feature_parser_spec.rb +5 -0
- data/spec/cucumber/treetop_parser/test_dos.feature +24 -0
- data/spec/spec_helper.rb +1 -7
- metadata +6 -2
@@ -8,8 +8,10 @@ module Cucumber
|
|
8
8
|
INDENT = "\n "
|
9
9
|
BACKTRACE_FILTER_PATTERNS = [/vendor\/rails/, /vendor\/plugins\/cucumber/, /spec\/expectations/, /spec\/matchers/]
|
10
10
|
|
11
|
-
def initialize(io)
|
11
|
+
def initialize(io, step_mother, options={})
|
12
12
|
@io = (io == STDOUT) ? Kernel : io
|
13
|
+
@options = options
|
14
|
+
@step_mother = step_mother
|
13
15
|
@passed = []
|
14
16
|
@failed = []
|
15
17
|
@pending = []
|
@@ -50,7 +52,12 @@ module Cucumber
|
|
50
52
|
args.each{|arg| @io.print passed(arg) ; @io.print "|"}
|
51
53
|
else
|
52
54
|
@passed << step
|
53
|
-
@io.
|
55
|
+
@io.print passed(" #{step.keyword} #{step.format(regexp){|param| passed_param(param) << passed}}")
|
56
|
+
if @options[:source]
|
57
|
+
@io.print padding_spaces(step)
|
58
|
+
@io.print source_comment(step)
|
59
|
+
end
|
60
|
+
@io.puts
|
54
61
|
end
|
55
62
|
end
|
56
63
|
|
@@ -62,11 +69,30 @@ module Cucumber
|
|
62
69
|
else
|
63
70
|
@failed << step
|
64
71
|
@scenario_failed = true
|
65
|
-
@io.
|
72
|
+
@io.print failed(" #{step.keyword} #{step.format(regexp){|param| failed_param(param) << failed}}")
|
73
|
+
if @options[:source]
|
74
|
+
@io.print padding_spaces(step)
|
75
|
+
@io.print source_comment(step)
|
76
|
+
end
|
77
|
+
@io.puts
|
66
78
|
output_failing_step(step)
|
67
79
|
end
|
68
80
|
end
|
69
81
|
|
82
|
+
def step_skipped(step, regexp, args)
|
83
|
+
@skipped << step
|
84
|
+
if step.row?
|
85
|
+
args.each{|arg| @io.print skipped(arg) ; @io.print "|"}
|
86
|
+
else
|
87
|
+
@io.print skipped(" #{step.keyword} #{step.format(regexp){|param| skipped_param(param) << skipped}}")
|
88
|
+
if @options[:source]
|
89
|
+
@io.print padding_spaces(step)
|
90
|
+
@io.print source_comment(step)
|
91
|
+
end
|
92
|
+
@io.puts
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
70
96
|
def step_pending(step, regexp, args)
|
71
97
|
if step.row?
|
72
98
|
@pending << step
|
@@ -77,17 +103,9 @@ module Cucumber
|
|
77
103
|
end
|
78
104
|
end
|
79
105
|
|
80
|
-
def step_skipped(step, regexp, args)
|
81
|
-
@skipped << step
|
82
|
-
if step.row?
|
83
|
-
args.each{|arg| @io.print skipped(arg) ; @io.print "|"}
|
84
|
-
else
|
85
|
-
@io.puts skipped(" #{step.keyword} #{step.format(regexp){|param| skipped_param(param) << skipped}}")
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
106
|
def output_failing_step(step)
|
90
|
-
|
107
|
+
backtrace = step.error.backtrace || []
|
108
|
+
clean_backtrace = backtrace.map {|b| b.split("\n") }.flatten.reject do |line|
|
91
109
|
BACKTRACE_FILTER_PATTERNS.detect{|p| line =~ p}
|
92
110
|
end.map { |line| line.strip }
|
93
111
|
@io.puts failed(" #{step.error.message.split("\n").join(INDENT)} (#{step.error.class})")
|
@@ -103,7 +121,7 @@ module Cucumber
|
|
103
121
|
@io.print reset
|
104
122
|
print_snippets
|
105
123
|
end
|
106
|
-
|
124
|
+
|
107
125
|
def print_snippets
|
108
126
|
unless @pending.empty?
|
109
127
|
@io.puts "\nYou can use these snippets to implement pending steps:\n\n"
|
@@ -111,7 +129,7 @@ module Cucumber
|
|
111
129
|
prev_keyword = nil
|
112
130
|
snippets = @pending.map do |step|
|
113
131
|
next if step.row?
|
114
|
-
snippet = "#{step.actual_keyword}
|
132
|
+
snippet = "#{step.actual_keyword} /^#{step.name}$/ do\nend\n\n"
|
115
133
|
prev_keyword = step.keyword
|
116
134
|
snippet
|
117
135
|
end.compact.uniq
|
@@ -121,6 +139,17 @@ module Cucumber
|
|
121
139
|
end
|
122
140
|
end
|
123
141
|
end
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
def source_comment(step)
|
146
|
+
_, _, proc = step.regexp_args_proc(@step_mother)
|
147
|
+
comment(proc.to_comment_line)
|
148
|
+
end
|
149
|
+
|
150
|
+
def padding_spaces(step)
|
151
|
+
" " * step.padding_length
|
152
|
+
end
|
124
153
|
end
|
125
154
|
end
|
126
155
|
end
|
data/lib/cucumber/languages.yml
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
when: Når
|
10
10
|
then: Så
|
11
11
|
and: Og
|
12
|
+
but: Men
|
12
13
|
"de":
|
13
14
|
feature: Funktionalität
|
14
15
|
scenario: Szenario
|
@@ -17,6 +18,7 @@
|
|
17
18
|
when: Wenn
|
18
19
|
then: Dann
|
19
20
|
and: Und
|
21
|
+
but: Aber
|
20
22
|
"en":
|
21
23
|
feature: Feature
|
22
24
|
scenario: Scenario
|
@@ -25,6 +27,7 @@
|
|
25
27
|
when: When
|
26
28
|
then: Then
|
27
29
|
and: And
|
30
|
+
but: But
|
28
31
|
"es":
|
29
32
|
feature: Característica
|
30
33
|
scenario: Escenario
|
@@ -33,6 +36,7 @@
|
|
33
36
|
when: Cuando
|
34
37
|
then: Entonces
|
35
38
|
and: Y
|
39
|
+
but: Pero
|
36
40
|
"fr":
|
37
41
|
feature: Fonction
|
38
42
|
scenario: Scenario
|
@@ -41,6 +45,7 @@
|
|
41
45
|
when: Lorsque
|
42
46
|
then: Alors
|
43
47
|
and: Et
|
48
|
+
but: Mais
|
44
49
|
"no":
|
45
50
|
feature: Egenskap
|
46
51
|
scenario: Scenario
|
@@ -49,6 +54,7 @@
|
|
49
54
|
when: Når
|
50
55
|
then: Så
|
51
56
|
and: Og
|
57
|
+
but: Men
|
52
58
|
"pt":
|
53
59
|
feature: Característica
|
54
60
|
scenario: Cenário
|
@@ -57,6 +63,7 @@
|
|
57
63
|
when: Quando
|
58
64
|
then: Então
|
59
65
|
and: E
|
66
|
+
but: Mas
|
60
67
|
"ru":
|
61
68
|
feature: Функционал
|
62
69
|
scenario: Сценарий
|
@@ -65,6 +72,7 @@
|
|
65
72
|
when: Если
|
66
73
|
then: То
|
67
74
|
and: И
|
75
|
+
but: Но
|
68
76
|
"se":
|
69
77
|
feature: Egenskap
|
70
78
|
scenario: Scenario
|
@@ -73,6 +81,7 @@
|
|
73
81
|
when: Når
|
74
82
|
then: Så
|
75
83
|
and: Och
|
84
|
+
but: Men
|
76
85
|
"et":
|
77
86
|
feature: Omadus
|
78
87
|
scenario: Stsenaarium
|
@@ -81,3 +90,4 @@
|
|
81
90
|
when: Kui
|
82
91
|
then: Siis
|
83
92
|
and: Ja
|
93
|
+
but: Kuid
|
@@ -5,19 +5,19 @@ module Cucumber
|
|
5
5
|
module StepMethods
|
6
6
|
# Each scenario will execute in the context of what the supplied block returns.
|
7
7
|
def World(&proc)
|
8
|
-
|
8
|
+
executor.register_world_proc(&proc)
|
9
9
|
end
|
10
10
|
|
11
11
|
def Before(&proc)
|
12
|
-
|
12
|
+
executor.register_before_scenario_proc(&proc)
|
13
13
|
end
|
14
14
|
|
15
15
|
def After(&proc)
|
16
|
-
|
16
|
+
executor.register_after_scenario_proc(&proc)
|
17
17
|
end
|
18
18
|
|
19
19
|
def AfterStep(&proc)
|
20
|
-
|
20
|
+
executor.register_after_step_proc(&proc)
|
21
21
|
end
|
22
22
|
|
23
23
|
def Given(key, &proc)
|
@@ -41,5 +41,9 @@ module Cucumber
|
|
41
41
|
def step_mother #:nodoc:
|
42
42
|
@step_mother ||= StepMother.new
|
43
43
|
end
|
44
|
+
|
45
|
+
def executor
|
46
|
+
@executor ||= Executor.new(step_mother)
|
47
|
+
end
|
44
48
|
end
|
45
49
|
end
|
data/lib/cucumber/step_mother.rb
CHANGED
@@ -40,8 +40,8 @@ module Cucumber
|
|
40
40
|
first_proc = @step_procs[regexp]
|
41
41
|
message = %{Duplicate step definitions:
|
42
42
|
|
43
|
-
#{first_proc.
|
44
|
-
#{proc.
|
43
|
+
#{first_proc.to_backtrace_line}
|
44
|
+
#{proc.to_backtrace_line}
|
45
45
|
|
46
46
|
}
|
47
47
|
raise Duplicate.new(message)
|
@@ -65,7 +65,7 @@ module Cucumber
|
|
65
65
|
else
|
66
66
|
message = %{Multiple step definitions match #{step_name.inspect}:
|
67
67
|
|
68
|
-
#{candidates.map{|regexp, args, proc| proc.
|
68
|
+
#{candidates.map{|regexp, args, proc| proc.to_backtrace_line}.join("\n")}
|
69
69
|
|
70
70
|
}
|
71
71
|
raise Multiple.new(message)
|
@@ -76,6 +76,7 @@ module Cucumber
|
|
76
76
|
@step_procs[regexp]
|
77
77
|
end
|
78
78
|
|
79
|
+
# TODO - move execute here?
|
79
80
|
def execute(step)
|
80
81
|
end
|
81
82
|
end
|
@@ -27,9 +27,11 @@ module Cucumber
|
|
27
27
|
end
|
28
28
|
|
29
29
|
class Scenario < BaseScenario
|
30
|
+
MIN_PADDING = 2
|
30
31
|
|
31
32
|
# If a table follows, the header will be stored here. Weird, but convenient.
|
32
33
|
attr_accessor :table_header
|
34
|
+
attr_reader :name, :line
|
33
35
|
|
34
36
|
def initialize(feature, name, &proc)
|
35
37
|
@feature, @name = feature, name
|
@@ -49,36 +51,46 @@ module Cucumber
|
|
49
51
|
@feature.scenario_named(name)
|
50
52
|
end
|
51
53
|
|
54
|
+
def padding_length(step)
|
55
|
+
(max_step_length - step.length) + MIN_PADDING
|
56
|
+
end
|
57
|
+
|
58
|
+
def max_step_length
|
59
|
+
steps.map{|step| step.length}.max
|
60
|
+
end
|
61
|
+
|
52
62
|
def row?
|
53
63
|
false
|
54
64
|
end
|
55
65
|
|
56
|
-
def
|
57
|
-
|
66
|
+
def create_step(keyword, name, line)
|
67
|
+
step = Step.new(self, keyword, name, line)
|
68
|
+
@steps_and_given_scenarios << step
|
69
|
+
step
|
58
70
|
end
|
59
71
|
|
60
|
-
def
|
61
|
-
|
72
|
+
def create_given_scenario(name, line)
|
73
|
+
given_scenario = GivenScenario.new(self, name, line)
|
74
|
+
@steps_and_given_scenarios << given_scenario
|
75
|
+
given_scenario
|
62
76
|
end
|
63
77
|
|
64
78
|
def Given(name)
|
65
|
-
|
79
|
+
create_step('Given', name, *caller[0].split(':')[1].to_i)
|
66
80
|
end
|
67
81
|
|
68
82
|
def When(name)
|
69
|
-
|
83
|
+
create_step('When', name, *caller[0].split(':')[1].to_i)
|
70
84
|
end
|
71
85
|
|
72
86
|
def Then(name)
|
73
|
-
|
87
|
+
create_step('Then', name, *caller[0].split(':')[1].to_i)
|
74
88
|
end
|
75
89
|
|
76
90
|
def And(name)
|
77
|
-
|
91
|
+
create_step('And', name, *caller[0].split(':')[1].to_i)
|
78
92
|
end
|
79
93
|
|
80
|
-
attr_reader :name, :line
|
81
|
-
|
82
94
|
end
|
83
95
|
|
84
96
|
class RowScenario < BaseScenario
|
data/lib/cucumber/tree/step.rb
CHANGED
@@ -17,6 +17,10 @@ module Cucumber
|
|
17
17
|
def steps
|
18
18
|
self
|
19
19
|
end
|
20
|
+
|
21
|
+
def length
|
22
|
+
keyword.length + 1 + name.length
|
23
|
+
end
|
20
24
|
|
21
25
|
if defined?(JRUBY_VERSION)
|
22
26
|
PENDING_ADJUSTMENT = 2
|
@@ -31,7 +35,7 @@ module Cucumber
|
|
31
35
|
begin
|
32
36
|
proc.call_in(world, *args)
|
33
37
|
rescue ArityMismatchError => e
|
34
|
-
e.backtrace[0] = proc.
|
38
|
+
e.backtrace[0] = proc.to_backtrace_line
|
35
39
|
strip_pos = e.backtrace.index("#{__FILE__}:#{__LINE__ - 3}:in `execute_in'")
|
36
40
|
format_error(strip_pos, proc, e)
|
37
41
|
rescue => e
|
@@ -73,6 +77,10 @@ module Cucumber
|
|
73
77
|
def previous_step
|
74
78
|
@scenario.previous_step(self)
|
75
79
|
end
|
80
|
+
|
81
|
+
def padding_length
|
82
|
+
@scenario.padding_length(self)
|
83
|
+
end
|
76
84
|
end
|
77
85
|
|
78
86
|
class Step < BaseStep
|
@@ -99,7 +99,7 @@ grammar Feature
|
|
99
99
|
given_scenario_keyword space name:line_to_eol {
|
100
100
|
def compile(scenario)
|
101
101
|
line = input.line_of(interval.first)
|
102
|
-
scenario.
|
102
|
+
scenario.create_given_scenario(name.text_value.strip, line)
|
103
103
|
end
|
104
104
|
}
|
105
105
|
end
|
@@ -108,7 +108,7 @@ grammar Feature
|
|
108
108
|
step_keyword space name:line_to_eol {
|
109
109
|
def compile(scenario)
|
110
110
|
line = input.line_of(interval.first)
|
111
|
-
scenario.
|
111
|
+
scenario.create_step(step_keyword.text_value, name.text_value.strip, line)
|
112
112
|
end
|
113
113
|
}
|
114
114
|
end
|
@@ -138,11 +138,11 @@ grammar Feature
|
|
138
138
|
end
|
139
139
|
|
140
140
|
rule eol
|
141
|
-
"\r\n?
|
141
|
+
("\r" "\n"?) / "\n"
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
rule step_keyword
|
145
|
-
'<%= words['given'] %>' / '<%= words['when'] %>' / '<%= words['then'] %>' / '<%= words['and'] %>'
|
145
|
+
'<%= words['given'] %>' / '<%= words['when'] %>' / '<%= words['then'] %>' / '<%= words['and'] %>' / '<%= words['but'] %>'
|
146
146
|
end
|
147
147
|
|
148
148
|
rule scenario_keyword
|
@@ -1,33 +1,33 @@
|
|
1
|
-
module Cucumber
|
2
|
-
module TreetopParser
|
1
|
+
module Cucumber #:nodoc:
|
2
|
+
module TreetopParser #:nodoc:
|
3
3
|
|
4
|
-
module Feature
|
4
|
+
module Feature #:nodoc:
|
5
5
|
include Treetop::Runtime
|
6
6
|
|
7
|
-
def root
|
7
|
+
def root #:nodoc:
|
8
8
|
@root || :root
|
9
9
|
end
|
10
10
|
|
11
|
-
module Root0
|
12
|
-
def header
|
11
|
+
module Root0 #:nodoc:
|
12
|
+
def header #:nodoc:
|
13
13
|
elements[0]
|
14
14
|
end
|
15
15
|
|
16
|
-
def scenario_sequence
|
16
|
+
def scenario_sequence #:nodoc:
|
17
17
|
elements[1]
|
18
18
|
end
|
19
19
|
|
20
20
|
end
|
21
21
|
|
22
|
-
module Root1
|
23
|
-
def compile
|
22
|
+
module Root1 #:nodoc:
|
23
|
+
def compile #:nodoc:
|
24
24
|
feature = Tree::Feature.new(header.text_value.strip)
|
25
25
|
scenario_sequence.compile(feature)
|
26
26
|
feature
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
def _nt_root
|
30
|
+
def _nt_root #:nodoc:
|
31
31
|
start_index = index
|
32
32
|
if node_cache[:root].has_key?(index)
|
33
33
|
cached = node_cache[:root][index]
|
@@ -65,10 +65,10 @@ module Feature
|
|
65
65
|
return r0
|
66
66
|
end
|
67
67
|
|
68
|
-
module Header0
|
68
|
+
module Header0 #:nodoc:
|
69
69
|
end
|
70
70
|
|
71
|
-
def _nt_header
|
71
|
+
def _nt_header #:nodoc:
|
72
72
|
start_index = index
|
73
73
|
if node_cache[:header].has_key?(index)
|
74
74
|
cached = node_cache[:header][index]
|
@@ -123,39 +123,39 @@ module Feature
|
|
123
123
|
return r0
|
124
124
|
end
|
125
125
|
|
126
|
-
module ScenarioSequence0
|
127
|
-
def space
|
126
|
+
module ScenarioSequence0 #:nodoc:
|
127
|
+
def space #:nodoc:
|
128
128
|
elements[0]
|
129
129
|
end
|
130
130
|
|
131
|
-
def scenario_or_table
|
131
|
+
def scenario_or_table #:nodoc:
|
132
132
|
elements[1]
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
-
module ScenarioSequence1
|
137
|
-
def head
|
136
|
+
module ScenarioSequence1 #:nodoc:
|
137
|
+
def head #:nodoc:
|
138
138
|
elements[0]
|
139
139
|
end
|
140
140
|
|
141
|
-
def tail
|
141
|
+
def tail #:nodoc:
|
142
142
|
elements[1]
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
-
module ScenarioSequence2
|
147
|
-
def compile(feature)
|
146
|
+
module ScenarioSequence2 #:nodoc:
|
147
|
+
def compile(feature) #:nodoc:
|
148
148
|
([head] + tail).each do |scenario_or_table|
|
149
149
|
scenario_or_table.compile(feature) if scenario_or_table.respond_to?(:compile)
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
153
|
-
def tail
|
153
|
+
def tail #:nodoc:
|
154
154
|
super.elements.map { |elt| elt.scenario_or_table }
|
155
155
|
end
|
156
156
|
end
|
157
157
|
|
158
|
-
def _nt_scenario_sequence
|
158
|
+
def _nt_scenario_sequence #:nodoc:
|
159
159
|
start_index = index
|
160
160
|
if node_cache[:scenario_sequence].has_key?(index)
|
161
161
|
cached = node_cache[:scenario_sequence][index]
|
@@ -211,36 +211,36 @@ module Feature
|
|
211
211
|
return r0
|
212
212
|
end
|
213
213
|
|
214
|
-
module Scenario0
|
215
|
-
def space
|
214
|
+
module Scenario0 #:nodoc:
|
215
|
+
def space #:nodoc:
|
216
216
|
elements[0]
|
217
217
|
end
|
218
218
|
|
219
|
-
def step_sequence
|
219
|
+
def step_sequence #:nodoc:
|
220
220
|
elements[1]
|
221
221
|
end
|
222
222
|
end
|
223
223
|
|
224
|
-
module Scenario1
|
225
|
-
def scenario_keyword
|
224
|
+
module Scenario1 #:nodoc:
|
225
|
+
def scenario_keyword #:nodoc:
|
226
226
|
elements[0]
|
227
227
|
end
|
228
228
|
|
229
|
-
def space
|
229
|
+
def space #:nodoc:
|
230
230
|
elements[1]
|
231
231
|
end
|
232
232
|
|
233
|
-
def name
|
233
|
+
def name #:nodoc:
|
234
234
|
elements[2]
|
235
235
|
end
|
236
236
|
|
237
|
-
def steps
|
237
|
+
def steps #:nodoc:
|
238
238
|
elements[3]
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
|
-
module Scenario2
|
243
|
-
def compile(feature)
|
242
|
+
module Scenario2 #:nodoc:
|
243
|
+
def compile(feature) #:nodoc:
|
244
244
|
scenario = feature.add_scenario(name.text_value.strip)
|
245
245
|
steps.step_sequence.compile(scenario) if steps.respond_to?(:step_sequence)
|
246
246
|
# TODO - GET RID OF THIS last_scenario NASTINESS
|
@@ -249,7 +249,7 @@ module Feature
|
|
249
249
|
end
|
250
250
|
end
|
251
251
|
|
252
|
-
def _nt_scenario
|
252
|
+
def _nt_scenario #:nodoc:
|
253
253
|
start_index = index
|
254
254
|
if node_cache[:scenario].has_key?(index)
|
255
255
|
cached = node_cache[:scenario][index]
|
@@ -304,7 +304,7 @@ module Feature
|
|
304
304
|
return r0
|
305
305
|
end
|
306
306
|
|
307
|
-
def _nt_scenario_or_table
|
307
|
+
def _nt_scenario_or_table #:nodoc:
|
308
308
|
start_index = index
|
309
309
|
if node_cache[:scenario_or_table].has_key?(index)
|
310
310
|
cached = node_cache[:scenario_or_table][index]
|
@@ -331,40 +331,40 @@ module Feature
|
|
331
331
|
return r0
|
332
332
|
end
|
333
333
|
|
334
|
-
module Table0
|
335
|
-
def eol
|
334
|
+
module Table0 #:nodoc:
|
335
|
+
def eol #:nodoc:
|
336
336
|
elements[1]
|
337
337
|
end
|
338
338
|
|
339
|
-
def table_line
|
339
|
+
def table_line #:nodoc:
|
340
340
|
elements[3]
|
341
341
|
end
|
342
342
|
end
|
343
343
|
|
344
|
-
module Table1
|
345
|
-
def head
|
344
|
+
module Table1 #:nodoc:
|
345
|
+
def head #:nodoc:
|
346
346
|
elements[0]
|
347
347
|
end
|
348
348
|
|
349
|
-
def body
|
349
|
+
def body #:nodoc:
|
350
350
|
elements[1]
|
351
351
|
end
|
352
352
|
end
|
353
353
|
|
354
|
-
module Table2
|
355
|
-
def compile(feature)
|
354
|
+
module Table2 #:nodoc:
|
355
|
+
def compile(feature) #:nodoc:
|
356
356
|
Feature.last_scenario.table_header = head.cell_values
|
357
357
|
body.each do |table_line|
|
358
358
|
feature.add_row_scenario(Feature.last_scenario, table_line.cell_values, table_line.line)
|
359
359
|
end
|
360
360
|
end
|
361
361
|
|
362
|
-
def body
|
362
|
+
def body #:nodoc:
|
363
363
|
super.elements.map { |elt| elt.table_line }
|
364
364
|
end
|
365
365
|
end
|
366
366
|
|
367
|
-
def _nt_table
|
367
|
+
def _nt_table #:nodoc:
|
368
368
|
start_index = index
|
369
369
|
if node_cache[:table].has_key?(index)
|
370
370
|
cached = node_cache[:table][index]
|
@@ -437,37 +437,37 @@ module Feature
|
|
437
437
|
return r0
|
438
438
|
end
|
439
439
|
|
440
|
-
module TableLine0
|
441
|
-
def cell_value
|
440
|
+
module TableLine0 #:nodoc:
|
441
|
+
def cell_value #:nodoc:
|
442
442
|
elements[1]
|
443
443
|
end
|
444
444
|
|
445
|
-
def separator
|
445
|
+
def separator #:nodoc:
|
446
446
|
elements[3]
|
447
447
|
end
|
448
448
|
end
|
449
449
|
|
450
|
-
module TableLine1
|
451
|
-
def separator
|
450
|
+
module TableLine1 #:nodoc:
|
451
|
+
def separator #:nodoc:
|
452
452
|
elements[0]
|
453
453
|
end
|
454
454
|
|
455
|
-
def cells
|
455
|
+
def cells #:nodoc:
|
456
456
|
elements[1]
|
457
457
|
end
|
458
458
|
end
|
459
459
|
|
460
|
-
module TableLine2
|
461
|
-
def cell_values
|
460
|
+
module TableLine2 #:nodoc:
|
461
|
+
def cell_values #:nodoc:
|
462
462
|
cells.elements.map { |elt| elt.cell_value.text_value.strip }
|
463
463
|
end
|
464
464
|
|
465
|
-
def line
|
465
|
+
def line #:nodoc:
|
466
466
|
input.line_of(interval.first)
|
467
467
|
end
|
468
468
|
end
|
469
469
|
|
470
|
-
def _nt_table_line
|
470
|
+
def _nt_table_line #:nodoc:
|
471
471
|
start_index = index
|
472
472
|
if node_cache[:table_line].has_key?(index)
|
473
473
|
cached = node_cache[:table_line][index]
|
@@ -549,10 +549,10 @@ module Feature
|
|
549
549
|
return r0
|
550
550
|
end
|
551
551
|
|
552
|
-
module CellValue0
|
552
|
+
module CellValue0 #:nodoc:
|
553
553
|
end
|
554
554
|
|
555
|
-
def _nt_cell_value
|
555
|
+
def _nt_cell_value #:nodoc:
|
556
556
|
start_index = index
|
557
557
|
if node_cache[:cell_value].has_key?(index)
|
558
558
|
cached = node_cache[:cell_value][index]
|
@@ -614,39 +614,39 @@ module Feature
|
|
614
614
|
return r0
|
615
615
|
end
|
616
616
|
|
617
|
-
module StepSequence0
|
618
|
-
def space
|
617
|
+
module StepSequence0 #:nodoc:
|
618
|
+
def space #:nodoc:
|
619
619
|
elements[0]
|
620
620
|
end
|
621
621
|
|
622
|
-
def step
|
622
|
+
def step #:nodoc:
|
623
623
|
elements[1]
|
624
624
|
end
|
625
625
|
end
|
626
626
|
|
627
|
-
module StepSequence1
|
628
|
-
def head
|
627
|
+
module StepSequence1 #:nodoc:
|
628
|
+
def head #:nodoc:
|
629
629
|
elements[0]
|
630
630
|
end
|
631
631
|
|
632
|
-
def tail
|
632
|
+
def tail #:nodoc:
|
633
633
|
elements[1]
|
634
634
|
end
|
635
635
|
end
|
636
636
|
|
637
|
-
module StepSequence2
|
638
|
-
def compile(scenario)
|
637
|
+
module StepSequence2 #:nodoc:
|
638
|
+
def compile(scenario) #:nodoc:
|
639
639
|
([head] + tail).each do |step|
|
640
640
|
step.compile(scenario)
|
641
641
|
end
|
642
642
|
end
|
643
643
|
|
644
|
-
def tail
|
644
|
+
def tail #:nodoc:
|
645
645
|
super.elements.map { |elt| elt.step }
|
646
646
|
end
|
647
647
|
end
|
648
648
|
|
649
|
-
def _nt_step_sequence
|
649
|
+
def _nt_step_sequence #:nodoc:
|
650
650
|
start_index = index
|
651
651
|
if node_cache[:step_sequence].has_key?(index)
|
652
652
|
cached = node_cache[:step_sequence][index]
|
@@ -697,7 +697,7 @@ module Feature
|
|
697
697
|
return r0
|
698
698
|
end
|
699
699
|
|
700
|
-
def _nt_step
|
700
|
+
def _nt_step #:nodoc:
|
701
701
|
start_index = index
|
702
702
|
if node_cache[:step].has_key?(index)
|
703
703
|
cached = node_cache[:step][index]
|
@@ -724,28 +724,28 @@ module Feature
|
|
724
724
|
return r0
|
725
725
|
end
|
726
726
|
|
727
|
-
module GivenScenario0
|
728
|
-
def given_scenario_keyword
|
727
|
+
module GivenScenario0 #:nodoc:
|
728
|
+
def given_scenario_keyword #:nodoc:
|
729
729
|
elements[0]
|
730
730
|
end
|
731
731
|
|
732
|
-
def space
|
732
|
+
def space #:nodoc:
|
733
733
|
elements[1]
|
734
734
|
end
|
735
735
|
|
736
|
-
def name
|
736
|
+
def name #:nodoc:
|
737
737
|
elements[2]
|
738
738
|
end
|
739
739
|
end
|
740
740
|
|
741
|
-
module GivenScenario1
|
742
|
-
def compile(scenario)
|
741
|
+
module GivenScenario1 #:nodoc:
|
742
|
+
def compile(scenario) #:nodoc:
|
743
743
|
line = input.line_of(interval.first)
|
744
|
-
scenario.
|
744
|
+
scenario.create_given_scenario(name.text_value.strip, line)
|
745
745
|
end
|
746
746
|
end
|
747
747
|
|
748
|
-
def _nt_given_scenario
|
748
|
+
def _nt_given_scenario #:nodoc:
|
749
749
|
start_index = index
|
750
750
|
if node_cache[:given_scenario].has_key?(index)
|
751
751
|
cached = node_cache[:given_scenario][index]
|
@@ -778,28 +778,28 @@ module Feature
|
|
778
778
|
return r0
|
779
779
|
end
|
780
780
|
|
781
|
-
module PlainStep0
|
782
|
-
def step_keyword
|
781
|
+
module PlainStep0 #:nodoc:
|
782
|
+
def step_keyword #:nodoc:
|
783
783
|
elements[0]
|
784
784
|
end
|
785
785
|
|
786
|
-
def space
|
786
|
+
def space #:nodoc:
|
787
787
|
elements[1]
|
788
788
|
end
|
789
789
|
|
790
|
-
def name
|
790
|
+
def name #:nodoc:
|
791
791
|
elements[2]
|
792
792
|
end
|
793
793
|
end
|
794
794
|
|
795
|
-
module PlainStep1
|
796
|
-
def compile(scenario)
|
795
|
+
module PlainStep1 #:nodoc:
|
796
|
+
def compile(scenario) #:nodoc:
|
797
797
|
line = input.line_of(interval.first)
|
798
|
-
scenario.
|
798
|
+
scenario.create_step(step_keyword.text_value, name.text_value.strip, line)
|
799
799
|
end
|
800
800
|
end
|
801
801
|
|
802
|
-
def _nt_plain_step
|
802
|
+
def _nt_plain_step #:nodoc:
|
803
803
|
start_index = index
|
804
804
|
if node_cache[:plain_step].has_key?(index)
|
805
805
|
cached = node_cache[:plain_step][index]
|
@@ -832,7 +832,7 @@ module Feature
|
|
832
832
|
return r0
|
833
833
|
end
|
834
834
|
|
835
|
-
def _nt_separator
|
835
|
+
def _nt_separator #:nodoc:
|
836
836
|
start_index = index
|
837
837
|
if node_cache[:separator].has_key?(index)
|
838
838
|
cached = node_cache[:separator][index]
|
@@ -853,7 +853,7 @@ module Feature
|
|
853
853
|
return r0
|
854
854
|
end
|
855
855
|
|
856
|
-
def _nt_space
|
856
|
+
def _nt_space #:nodoc:
|
857
857
|
start_index = index
|
858
858
|
if node_cache[:space].has_key?(index)
|
859
859
|
cached = node_cache[:space][index]
|
@@ -894,10 +894,10 @@ module Feature
|
|
894
894
|
return r0
|
895
895
|
end
|
896
896
|
|
897
|
-
module LineToEol0
|
897
|
+
module LineToEol0 #:nodoc:
|
898
898
|
end
|
899
899
|
|
900
|
-
def _nt_line_to_eol
|
900
|
+
def _nt_line_to_eol #:nodoc:
|
901
901
|
start_index = index
|
902
902
|
if node_cache[:line_to_eol].has_key?(index)
|
903
903
|
cached = node_cache[:line_to_eol][index]
|
@@ -947,13 +947,13 @@ module Feature
|
|
947
947
|
return r0
|
948
948
|
end
|
949
949
|
|
950
|
-
module CommentToEol0
|
951
|
-
def line_to_eol
|
950
|
+
module CommentToEol0 #:nodoc:
|
951
|
+
def line_to_eol #:nodoc:
|
952
952
|
elements[1]
|
953
953
|
end
|
954
954
|
end
|
955
955
|
|
956
|
-
def _nt_comment_to_eol
|
956
|
+
def _nt_comment_to_eol #:nodoc:
|
957
957
|
start_index = index
|
958
958
|
if node_cache[:comment_to_eol].has_key?(index)
|
959
959
|
cached = node_cache[:comment_to_eol][index]
|
@@ -987,7 +987,7 @@ module Feature
|
|
987
987
|
return r0
|
988
988
|
end
|
989
989
|
|
990
|
-
def _nt_white
|
990
|
+
def _nt_white #:nodoc:
|
991
991
|
start_index = index
|
992
992
|
if node_cache[:white].has_key?(index)
|
993
993
|
cached = node_cache[:white][index]
|
@@ -1014,7 +1014,7 @@ module Feature
|
|
1014
1014
|
return r0
|
1015
1015
|
end
|
1016
1016
|
|
1017
|
-
def _nt_blank
|
1017
|
+
def _nt_blank #:nodoc:
|
1018
1018
|
start_index = index
|
1019
1019
|
if node_cache[:blank].has_key?(index)
|
1020
1020
|
cached = node_cache[:blank][index]
|
@@ -1034,7 +1034,10 @@ module Feature
|
|
1034
1034
|
return r0
|
1035
1035
|
end
|
1036
1036
|
|
1037
|
-
|
1037
|
+
module Eol0 #:nodoc:
|
1038
|
+
end
|
1039
|
+
|
1040
|
+
def _nt_eol #:nodoc:
|
1038
1041
|
start_index = index
|
1039
1042
|
if node_cache[:eol].has_key?(index)
|
1040
1043
|
cached = node_cache[:eol][index]
|
@@ -1043,25 +1046,49 @@ module Feature
|
|
1043
1046
|
end
|
1044
1047
|
|
1045
1048
|
i0 = index
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
1049
|
+
i1, s1 = index, []
|
1050
|
+
if input.index("\r", index) == index
|
1051
|
+
r2 = (SyntaxNode).new(input, index...(index + 1))
|
1052
|
+
@index += 1
|
1049
1053
|
else
|
1050
|
-
terminal_parse_failure("\r
|
1054
|
+
terminal_parse_failure("\r")
|
1055
|
+
r2 = nil
|
1056
|
+
end
|
1057
|
+
s1 << r2
|
1058
|
+
if r2
|
1059
|
+
if input.index("\n", index) == index
|
1060
|
+
r4 = (SyntaxNode).new(input, index...(index + 1))
|
1061
|
+
@index += 1
|
1062
|
+
else
|
1063
|
+
terminal_parse_failure("\n")
|
1064
|
+
r4 = nil
|
1065
|
+
end
|
1066
|
+
if r4
|
1067
|
+
r3 = r4
|
1068
|
+
else
|
1069
|
+
r3 = SyntaxNode.new(input, index...index)
|
1070
|
+
end
|
1071
|
+
s1 << r3
|
1072
|
+
end
|
1073
|
+
if s1.last
|
1074
|
+
r1 = (SyntaxNode).new(input, i1...index, s1)
|
1075
|
+
r1.extend(Eol0)
|
1076
|
+
else
|
1077
|
+
self.index = i1
|
1051
1078
|
r1 = nil
|
1052
1079
|
end
|
1053
1080
|
if r1
|
1054
1081
|
r0 = r1
|
1055
1082
|
else
|
1056
1083
|
if input.index("\n", index) == index
|
1057
|
-
|
1084
|
+
r5 = (SyntaxNode).new(input, index...(index + 1))
|
1058
1085
|
@index += 1
|
1059
1086
|
else
|
1060
1087
|
terminal_parse_failure("\n")
|
1061
|
-
|
1088
|
+
r5 = nil
|
1062
1089
|
end
|
1063
|
-
if
|
1064
|
-
r0 =
|
1090
|
+
if r5
|
1091
|
+
r0 = r5
|
1065
1092
|
else
|
1066
1093
|
self.index = i0
|
1067
1094
|
r0 = nil
|
@@ -1073,7 +1100,7 @@ module Feature
|
|
1073
1100
|
return r0
|
1074
1101
|
end
|
1075
1102
|
|
1076
|
-
def _nt_step_keyword
|
1103
|
+
def _nt_step_keyword #:nodoc:
|
1077
1104
|
start_index = index
|
1078
1105
|
if node_cache[:step_keyword].has_key?(index)
|
1079
1106
|
cached = node_cache[:step_keyword][index]
|
@@ -1122,8 +1149,19 @@ module Feature
|
|
1122
1149
|
if r4
|
1123
1150
|
r0 = r4
|
1124
1151
|
else
|
1125
|
-
|
1126
|
-
|
1152
|
+
if input.index('Men', index) == index
|
1153
|
+
r5 = (SyntaxNode).new(input, index...(index + 3))
|
1154
|
+
@index += 3
|
1155
|
+
else
|
1156
|
+
terminal_parse_failure('Men')
|
1157
|
+
r5 = nil
|
1158
|
+
end
|
1159
|
+
if r5
|
1160
|
+
r0 = r5
|
1161
|
+
else
|
1162
|
+
self.index = i0
|
1163
|
+
r0 = nil
|
1164
|
+
end
|
1127
1165
|
end
|
1128
1166
|
end
|
1129
1167
|
end
|
@@ -1134,7 +1172,7 @@ module Feature
|
|
1134
1172
|
return r0
|
1135
1173
|
end
|
1136
1174
|
|
1137
|
-
def _nt_scenario_keyword
|
1175
|
+
def _nt_scenario_keyword #:nodoc:
|
1138
1176
|
start_index = index
|
1139
1177
|
if node_cache[:scenario_keyword].has_key?(index)
|
1140
1178
|
cached = node_cache[:scenario_keyword][index]
|
@@ -1155,10 +1193,10 @@ module Feature
|
|
1155
1193
|
return r0
|
1156
1194
|
end
|
1157
1195
|
|
1158
|
-
module GivenScenarioKeyword0
|
1196
|
+
module GivenScenarioKeyword0 #:nodoc:
|
1159
1197
|
end
|
1160
1198
|
|
1161
|
-
def _nt_given_scenario_keyword
|
1199
|
+
def _nt_given_scenario_keyword #:nodoc:
|
1162
1200
|
start_index = index
|
1163
1201
|
if node_cache[:given_scenario_keyword].has_key?(index)
|
1164
1202
|
cached = node_cache[:given_scenario_keyword][index]
|
@@ -1205,7 +1243,7 @@ module Feature
|
|
1205
1243
|
|
1206
1244
|
end
|
1207
1245
|
|
1208
|
-
class FeatureParser < Treetop::Runtime::CompiledParser
|
1246
|
+
class FeatureParser < Treetop::Runtime::CompiledParser #:nodoc:
|
1209
1247
|
include Feature
|
1210
1248
|
end
|
1211
1249
|
|