cucumber 0.1.14 → 0.1.15
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.
- data/History.txt +12 -0
- data/Manifest.txt +13 -2
- data/examples/i18n/Rakefile +1 -1
- data/examples/i18n/ko/Rakefile +6 -0
- data/examples/i18n/ko/features/addition.feature +17 -0
- data/examples/i18n/ko/features/division.feature +11 -0
- data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +28 -0
- data/examples/i18n/ko/lib/calculator.rb +14 -0
- data/examples/self_test/README.textile +3 -0
- data/examples/self_test/features/sample.feature +10 -0
- data/examples/self_test/features/step_definitions/sample_steps.rb +6 -0
- data/features/cucumber_cli.feature +96 -0
- data/features/step_definitions/cucumber_steps.rb +16 -0
- data/features/step_definitions/extra_steps.rb +2 -0
- data/features/support/env.rb +1 -0
- data/lib/autotest/cucumber_mixin.rb +4 -1
- data/lib/cucumber/core_ext/exception.rb +2 -2
- data/lib/cucumber/formatters/pretty_formatter.rb +2 -2
- data/lib/cucumber/formatters/unicode.rb +10 -2
- data/lib/cucumber/languages.yml +11 -0
- data/lib/cucumber/tree/step.rb +1 -1
- data/lib/cucumber/treetop_parser/feature_ko.rb +1951 -0
- data/lib/cucumber/version.rb +1 -1
- data/spec/cucumber/formatters/pretty_formatter_spec.rb +37 -10
- data/spec/cucumber/formatters/profile_formatter_spec.rb +5 -0
- metadata +15 -4
- data/features/see_features.feature +0 -8
- data/features/steps/features_steps.rb +0 -9
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
== 0.1.15 2009-01-08
|
2
|
+
|
3
|
+
Bugfix release
|
4
|
+
|
5
|
+
=== New features
|
6
|
+
* 한국어! (Korean!) (John Hwang)
|
7
|
+
|
8
|
+
=== Bugfixes
|
9
|
+
* Fix a minor bug in the console formatter's summary (David Chelimsky)
|
10
|
+
* Better quoting of Scenario names in Autotest (Peter Jaros)
|
11
|
+
* Added some small workarounds for unicode handling on Windows (Aslak Hellesøy)
|
12
|
+
|
1
13
|
== 0.1.14 2009-01-04
|
2
14
|
|
3
15
|
This is the first release of Cucumber that runs on Ruby 1.9. There are still some encoding-related issues
|
data/Manifest.txt
CHANGED
@@ -65,6 +65,11 @@ examples/i18n/ja/features/addition.feature
|
|
65
65
|
examples/i18n/ja/features/division.feature
|
66
66
|
examples/i18n/ja/features/step_definitons/calculator_steps.rb
|
67
67
|
examples/i18n/ja/lib/calculator.rb
|
68
|
+
examples/i18n/ko/Rakefile
|
69
|
+
examples/i18n/ko/features/addition.feature
|
70
|
+
examples/i18n/ko/features/division.feature
|
71
|
+
examples/i18n/ko/features/step_definitons/calculator_steps.rb
|
72
|
+
examples/i18n/ko/lib/calculator.rb
|
68
73
|
examples/i18n/lt/Rakefile
|
69
74
|
examples/i18n/lt/features/addition.feature
|
70
75
|
examples/i18n/lt/features/division.feature
|
@@ -99,6 +104,9 @@ examples/java/features/tree.feature
|
|
99
104
|
examples/selenium/Rakefile
|
100
105
|
examples/selenium/features/search.feature
|
101
106
|
examples/selenium/features/step_definitons/stories_steps.rb
|
107
|
+
examples/self_test/README.textile
|
108
|
+
examples/self_test/features/sample.feature
|
109
|
+
examples/self_test/features/step_definitions/sample_steps.rb
|
102
110
|
examples/test_unit/Rakefile
|
103
111
|
examples/test_unit/features/step_definitions/test_unit_steps.rb
|
104
112
|
examples/test_unit/features/test_unit.feature
|
@@ -115,8 +123,10 @@ examples/watir/Rakefile
|
|
115
123
|
examples/watir/features/search.feature
|
116
124
|
examples/watir/features/step_definitons/search_steps.rb
|
117
125
|
examples/watir/features/support/env.rb
|
118
|
-
features/
|
119
|
-
features/
|
126
|
+
features/cucumber_cli.feature
|
127
|
+
features/step_definitions/cucumber_steps.rb
|
128
|
+
features/step_definitions/extra_steps.rb
|
129
|
+
features/support/env.rb
|
120
130
|
gem_tasks/deployment.rake
|
121
131
|
gem_tasks/environment.rake
|
122
132
|
gem_tasks/features.rake
|
@@ -181,6 +191,7 @@ lib/cucumber/treetop_parser/feature_fr.rb
|
|
181
191
|
lib/cucumber/treetop_parser/feature_id.rb
|
182
192
|
lib/cucumber/treetop_parser/feature_it.rb
|
183
193
|
lib/cucumber/treetop_parser/feature_ja.rb
|
194
|
+
lib/cucumber/treetop_parser/feature_ko.rb
|
184
195
|
lib/cucumber/treetop_parser/feature_lt.rb
|
185
196
|
lib/cucumber/treetop_parser/feature_nl.rb
|
186
197
|
lib/cucumber/treetop_parser/feature_no.rb
|
data/examples/i18n/Rakefile
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
기능: 덧셈
|
2
|
+
어이없는 실수을 방지하기 위해
|
3
|
+
수학을 잘 못하는 사람으로써
|
4
|
+
두숫자의 합을 알고 싶다
|
5
|
+
|
6
|
+
예: 두 숫자를 더하기
|
7
|
+
조건 계산기에 50을 입력했음
|
8
|
+
그리고 계산기에 70을 입력했음
|
9
|
+
만일 내가 add를 누루면
|
10
|
+
그러면 화면에 출력된 결과는 120이다
|
11
|
+
그리고 결과의 class는 Fixnum이다
|
12
|
+
|
13
|
+
다른 예:
|
14
|
+
| 입력1 | 입력2 | 버튼 | 결과 | class |
|
15
|
+
| 20 | 30 | add | 50 | Fixnum |
|
16
|
+
| 2 | 5 | add | 7 | Fixnum |
|
17
|
+
| 0 | 40 | add | 40 | Fixnum |
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec/expectations'
|
3
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
4
|
+
require 'cucumber/formatters/unicode'
|
5
|
+
require 'calculator'
|
6
|
+
|
7
|
+
Before do
|
8
|
+
@calc = Calculator.new
|
9
|
+
end
|
10
|
+
|
11
|
+
After do
|
12
|
+
end
|
13
|
+
|
14
|
+
Given /^계산기에 (.*)을 입력했음$/ do |n|
|
15
|
+
@calc.push n.to_i
|
16
|
+
end
|
17
|
+
|
18
|
+
When /^내가 (.*)를 누루면$/ do |op|
|
19
|
+
@result = @calc.send op
|
20
|
+
end
|
21
|
+
|
22
|
+
Then /^화면에 출력된 결과는 (.*)이다$/ do |result|
|
23
|
+
@result.should == result.to_f
|
24
|
+
end
|
25
|
+
|
26
|
+
Then /^결과의 class는 (.*)이다$/ do |class_name|
|
27
|
+
@result.class.name.should == class_name
|
28
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
Feature: Run single scenario
|
2
|
+
In order to speed up development
|
3
|
+
Developers should be able to run just a single scenario
|
4
|
+
|
5
|
+
Scenario: Run single scenario with missing step definition
|
6
|
+
When I run cucumber -q features/sample.feature:3
|
7
|
+
Then the output should be
|
8
|
+
"""
|
9
|
+
Feature: Sample
|
10
|
+
Scenario: Missing
|
11
|
+
Given missing
|
12
|
+
|
13
|
+
|
14
|
+
1 scenario
|
15
|
+
1 step pending (1 with no step definition)
|
16
|
+
|
17
|
+
"""
|
18
|
+
|
19
|
+
Scenario: Run single failing scenario
|
20
|
+
When I run cucumber -q features/sample.feature:9
|
21
|
+
Then the output should be
|
22
|
+
"""
|
23
|
+
Feature: Sample
|
24
|
+
Scenario: Failing
|
25
|
+
Given failing
|
26
|
+
FAIL (RuntimeError)
|
27
|
+
./features/step_definitions/sample_steps.rb:5:in `Given /^failing$/'
|
28
|
+
features/sample.feature:10:in `Given failing'
|
29
|
+
|
30
|
+
|
31
|
+
1 scenario
|
32
|
+
1 step failed
|
33
|
+
|
34
|
+
"""
|
35
|
+
|
36
|
+
Scenario: Require missing step definition from elsewhere
|
37
|
+
When I run cucumber -q -r ../../features/step_definitions/extra_steps.rb features/sample.feature:3
|
38
|
+
Then the output should be
|
39
|
+
"""
|
40
|
+
Feature: Sample
|
41
|
+
Scenario: Missing
|
42
|
+
Given missing
|
43
|
+
|
44
|
+
|
45
|
+
1 scenario
|
46
|
+
1 step passed
|
47
|
+
|
48
|
+
"""
|
49
|
+
|
50
|
+
Scenario: Run all with progress formatter
|
51
|
+
When I run cucumber -q --format progress features/sample.feature
|
52
|
+
Then the output should be
|
53
|
+
"""
|
54
|
+
P.F
|
55
|
+
|
56
|
+
Pending Scenarios:
|
57
|
+
|
58
|
+
1) Sample (Missing)
|
59
|
+
|
60
|
+
|
61
|
+
Failed:
|
62
|
+
|
63
|
+
1)
|
64
|
+
FAIL
|
65
|
+
./features/step_definitions/sample_steps.rb:5:in `Given /^failing$/'
|
66
|
+
features/sample.feature:10:in `Given failing'
|
67
|
+
|
68
|
+
"""
|
69
|
+
|
70
|
+
Scenario: Run Norwegian
|
71
|
+
Given I am in i18n/no
|
72
|
+
When I run cucumber -q --language no features
|
73
|
+
Then the output should be
|
74
|
+
"""
|
75
|
+
Egenskap: Summering
|
76
|
+
For å slippe å gjøre dumme feil
|
77
|
+
Som en regnskapsfører
|
78
|
+
Vil jeg kunne legge sammen
|
79
|
+
Scenario: to tall
|
80
|
+
Gitt at jeg har tastet inn 5
|
81
|
+
Og at jeg har tastet inn 7
|
82
|
+
Når jeg summerer
|
83
|
+
Så skal resultatet være 12
|
84
|
+
|
85
|
+
Scenario: tre tall
|
86
|
+
Gitt at jeg har tastet inn 5
|
87
|
+
Og at jeg har tastet inn 7
|
88
|
+
Og at jeg har tastet inn 1
|
89
|
+
Når jeg summerer
|
90
|
+
Så skal resultatet være 13
|
91
|
+
|
92
|
+
|
93
|
+
2 scenarios
|
94
|
+
9 steps passed
|
95
|
+
|
96
|
+
"""
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Given /^I am in (.*)$/ do |dir|
|
2
|
+
@dir = dir
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I run cucumber (.*)$/ do |cmd|
|
6
|
+
@dir ||= 'self_test'
|
7
|
+
full_dir ||= File.expand_path(File.dirname(__FILE__) + "/../../examples/#{@dir}")
|
8
|
+
Dir.chdir(full_dir) do
|
9
|
+
@full_cmd = "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} #{cmd}"
|
10
|
+
@out = `#{@full_cmd}`
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Then /^the output should be$/ do |output|
|
15
|
+
@out.should == output
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'spec'
|
@@ -120,7 +120,10 @@ module Autotest::CucumberMixin
|
|
120
120
|
if scenarios_to_run == :all
|
121
121
|
scenario_args = nil
|
122
122
|
else
|
123
|
-
|
123
|
+
# We escape scenario names for the shell by wrapping them in $'...' and replacing
|
124
|
+
# every single quote with an escaped version, "\'". We use a double backslash for
|
125
|
+
# Ruby, and we put it in a block or gsub interpolates the sequence "\'" as $'.
|
126
|
+
scenario_args = scenarios_to_run.map { |s| "-s $'#{s.gsub("'") {"\\'"} }'" }.join(' ')
|
124
127
|
end
|
125
128
|
return "#{Cucumber::RUBY_BINARY} #{Cucumber::BINARY} #{args} #{scenario_args}"
|
126
129
|
end
|
@@ -183,8 +183,8 @@ module Cucumber
|
|
183
183
|
@io.puts pending(dump_count(@pending_scenarios.length, "scenario", "pending")) if @pending_scenarios.any?
|
184
184
|
|
185
185
|
@io.puts passed(dump_count(@passed.length, "step", "passed")) if @passed.any?
|
186
|
-
@io.puts
|
187
|
-
@io.puts
|
186
|
+
@io.puts failed(dump_count(@failed.length, "step", "failed")) if @failed.any?
|
187
|
+
@io.puts skipped(dump_count(@skipped.length, "step", "skipped")) if @skipped.any?
|
188
188
|
|
189
189
|
if @pending_steps.any?
|
190
190
|
@io.print pending(dump_count(@pending_steps.length, "step", "pending"))
|
@@ -15,12 +15,20 @@ if Cucumber::WINDOWS_MRI && `chcp` =~ /Active code page: (\d+)/
|
|
15
15
|
module Kernel
|
16
16
|
alias cucumber_print print
|
17
17
|
def print(*a)
|
18
|
-
|
18
|
+
begin
|
19
|
+
cucumber_print *Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a)
|
20
|
+
rescue Iconv::IllegalSequence
|
21
|
+
cucumber_print(*a)
|
22
|
+
end
|
19
23
|
end
|
20
24
|
|
21
25
|
alias cucumber_puts puts
|
22
26
|
def puts(*a)
|
23
|
-
|
27
|
+
begin
|
28
|
+
cucumber_puts *Iconv.iconv(Cucumber::CODEPAGE, "UTF-8", *a)
|
29
|
+
rescue Iconv::IllegalSequence
|
30
|
+
cucumber_puts(*a)
|
31
|
+
end
|
24
32
|
end
|
25
33
|
end
|
26
34
|
end
|
data/lib/cucumber/languages.yml
CHANGED
data/lib/cucumber/tree/step.rb
CHANGED
@@ -64,7 +64,7 @@ module Cucumber
|
|
64
64
|
@error = e
|
65
65
|
# Remove lines underneath the plain text step
|
66
66
|
e.backtrace[strip_pos..-1] = nil unless strip_pos.nil?
|
67
|
-
e.backtrace.
|
67
|
+
e.backtrace.compact!
|
68
68
|
# Replace the step line with something more readable
|
69
69
|
e.backtrace.replace(e.backtrace.map{|l| l.gsub(/`#{proc.meth}'/, "`#{keyword} #{proc.name}'")})
|
70
70
|
if row?
|
@@ -0,0 +1,1951 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Cucumber
|
3
|
+
# :stopdoc:
|
4
|
+
module TreetopParser
|
5
|
+
module Feature
|
6
|
+
include Treetop::Runtime
|
7
|
+
|
8
|
+
def root
|
9
|
+
@root || :root
|
10
|
+
end
|
11
|
+
|
12
|
+
module Root0
|
13
|
+
def header
|
14
|
+
elements[1]
|
15
|
+
end
|
16
|
+
|
17
|
+
def scenario_sequence
|
18
|
+
elements[2]
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
module Root1
|
24
|
+
def compile
|
25
|
+
feature = Tree::Feature.new(header.text_value.strip)
|
26
|
+
scenario_sequence.compile(feature)
|
27
|
+
feature
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def _nt_root
|
32
|
+
start_index = index
|
33
|
+
if node_cache[:root].has_key?(index)
|
34
|
+
cached = node_cache[:root][index]
|
35
|
+
@index = cached.interval.end if cached
|
36
|
+
return cached
|
37
|
+
end
|
38
|
+
|
39
|
+
i0, s0 = index, []
|
40
|
+
r2 = _nt_space
|
41
|
+
if r2
|
42
|
+
r1 = r2
|
43
|
+
else
|
44
|
+
r1 = SyntaxNode.new(input, index...index)
|
45
|
+
end
|
46
|
+
s0 << r1
|
47
|
+
if r1
|
48
|
+
r3 = _nt_header
|
49
|
+
s0 << r3
|
50
|
+
if r3
|
51
|
+
r4 = _nt_scenario_sequence
|
52
|
+
s0 << r4
|
53
|
+
if r4
|
54
|
+
r6 = _nt_space
|
55
|
+
if r6
|
56
|
+
r5 = r6
|
57
|
+
else
|
58
|
+
r5 = SyntaxNode.new(input, index...index)
|
59
|
+
end
|
60
|
+
s0 << r5
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
if s0.last
|
65
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
66
|
+
r0.extend(Root0)
|
67
|
+
r0.extend(Root1)
|
68
|
+
else
|
69
|
+
self.index = i0
|
70
|
+
r0 = nil
|
71
|
+
end
|
72
|
+
|
73
|
+
node_cache[:root][start_index] = r0
|
74
|
+
|
75
|
+
return r0
|
76
|
+
end
|
77
|
+
|
78
|
+
module Header0
|
79
|
+
end
|
80
|
+
|
81
|
+
def _nt_header
|
82
|
+
start_index = index
|
83
|
+
if node_cache[:header].has_key?(index)
|
84
|
+
cached = node_cache[:header][index]
|
85
|
+
@index = cached.interval.end if cached
|
86
|
+
return cached
|
87
|
+
end
|
88
|
+
|
89
|
+
s0, i0 = [], index
|
90
|
+
loop do
|
91
|
+
i1, s1 = index, []
|
92
|
+
i2 = index
|
93
|
+
i3 = index
|
94
|
+
r4 = _nt_scenario_keyword
|
95
|
+
if r4
|
96
|
+
r3 = r4
|
97
|
+
else
|
98
|
+
r5 = _nt_scenario_outline_keyword
|
99
|
+
if r5
|
100
|
+
r3 = r5
|
101
|
+
else
|
102
|
+
r6 = _nt_comment_to_eol
|
103
|
+
if r6
|
104
|
+
r3 = r6
|
105
|
+
else
|
106
|
+
self.index = i3
|
107
|
+
r3 = nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
if r3
|
112
|
+
r2 = nil
|
113
|
+
else
|
114
|
+
self.index = i2
|
115
|
+
r2 = SyntaxNode.new(input, index...index)
|
116
|
+
end
|
117
|
+
s1 << r2
|
118
|
+
if r2
|
119
|
+
if index < input_length
|
120
|
+
r7 = (SyntaxNode).new(input, index...(index + 1))
|
121
|
+
@index += 1
|
122
|
+
else
|
123
|
+
terminal_parse_failure("any character")
|
124
|
+
r7 = nil
|
125
|
+
end
|
126
|
+
s1 << r7
|
127
|
+
end
|
128
|
+
if s1.last
|
129
|
+
r1 = (SyntaxNode).new(input, i1...index, s1)
|
130
|
+
r1.extend(Header0)
|
131
|
+
else
|
132
|
+
self.index = i1
|
133
|
+
r1 = nil
|
134
|
+
end
|
135
|
+
if r1
|
136
|
+
s0 << r1
|
137
|
+
else
|
138
|
+
break
|
139
|
+
end
|
140
|
+
end
|
141
|
+
if s0.empty?
|
142
|
+
self.index = i0
|
143
|
+
r0 = nil
|
144
|
+
else
|
145
|
+
r0 = SyntaxNode.new(input, i0...index, s0)
|
146
|
+
end
|
147
|
+
|
148
|
+
node_cache[:header][start_index] = r0
|
149
|
+
|
150
|
+
return r0
|
151
|
+
end
|
152
|
+
|
153
|
+
module ScenarioSequence0
|
154
|
+
def space
|
155
|
+
elements[0]
|
156
|
+
end
|
157
|
+
|
158
|
+
def scenario_or_scenario_outline_or_table
|
159
|
+
elements[1]
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
module ScenarioSequence1
|
164
|
+
def head
|
165
|
+
elements[0]
|
166
|
+
end
|
167
|
+
|
168
|
+
def tail
|
169
|
+
elements[1]
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
module ScenarioSequence2
|
174
|
+
def compile(feature)
|
175
|
+
([head] + tail).each do |scenario_or_scenario_outline_or_table|
|
176
|
+
scenario_or_scenario_outline_or_table.compile(feature) if scenario_or_scenario_outline_or_table.respond_to?(:compile)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def tail
|
181
|
+
super.elements.map { |elt| elt.scenario_or_scenario_outline_or_table }
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def _nt_scenario_sequence
|
186
|
+
start_index = index
|
187
|
+
if node_cache[:scenario_sequence].has_key?(index)
|
188
|
+
cached = node_cache[:scenario_sequence][index]
|
189
|
+
@index = cached.interval.end if cached
|
190
|
+
return cached
|
191
|
+
end
|
192
|
+
|
193
|
+
i0, s0 = index, []
|
194
|
+
r2 = _nt_scenario_outline_or_scenario
|
195
|
+
if r2
|
196
|
+
r1 = r2
|
197
|
+
else
|
198
|
+
r1 = SyntaxNode.new(input, index...index)
|
199
|
+
end
|
200
|
+
s0 << r1
|
201
|
+
if r1
|
202
|
+
s3, i3 = [], index
|
203
|
+
loop do
|
204
|
+
i4, s4 = index, []
|
205
|
+
r5 = _nt_space
|
206
|
+
s4 << r5
|
207
|
+
if r5
|
208
|
+
r6 = _nt_scenario_or_scenario_outline_or_table
|
209
|
+
s4 << r6
|
210
|
+
end
|
211
|
+
if s4.last
|
212
|
+
r4 = (SyntaxNode).new(input, i4...index, s4)
|
213
|
+
r4.extend(ScenarioSequence0)
|
214
|
+
else
|
215
|
+
self.index = i4
|
216
|
+
r4 = nil
|
217
|
+
end
|
218
|
+
if r4
|
219
|
+
s3 << r4
|
220
|
+
else
|
221
|
+
break
|
222
|
+
end
|
223
|
+
end
|
224
|
+
r3 = SyntaxNode.new(input, i3...index, s3)
|
225
|
+
s0 << r3
|
226
|
+
end
|
227
|
+
if s0.last
|
228
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
229
|
+
r0.extend(ScenarioSequence1)
|
230
|
+
r0.extend(ScenarioSequence2)
|
231
|
+
else
|
232
|
+
self.index = i0
|
233
|
+
r0 = nil
|
234
|
+
end
|
235
|
+
|
236
|
+
node_cache[:scenario_sequence][start_index] = r0
|
237
|
+
|
238
|
+
return r0
|
239
|
+
end
|
240
|
+
|
241
|
+
def _nt_scenario_outline_or_scenario
|
242
|
+
start_index = index
|
243
|
+
if node_cache[:scenario_outline_or_scenario].has_key?(index)
|
244
|
+
cached = node_cache[:scenario_outline_or_scenario][index]
|
245
|
+
@index = cached.interval.end if cached
|
246
|
+
return cached
|
247
|
+
end
|
248
|
+
|
249
|
+
i0 = index
|
250
|
+
r1 = _nt_scenario_outline
|
251
|
+
if r1
|
252
|
+
r0 = r1
|
253
|
+
else
|
254
|
+
r2 = _nt_scenario
|
255
|
+
if r2
|
256
|
+
r0 = r2
|
257
|
+
else
|
258
|
+
self.index = i0
|
259
|
+
r0 = nil
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
node_cache[:scenario_outline_or_scenario][start_index] = r0
|
264
|
+
|
265
|
+
return r0
|
266
|
+
end
|
267
|
+
|
268
|
+
module Scenario0
|
269
|
+
def space
|
270
|
+
elements[0]
|
271
|
+
end
|
272
|
+
|
273
|
+
def step_sequence
|
274
|
+
elements[1]
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
module Scenario1
|
279
|
+
def scenario_keyword
|
280
|
+
elements[0]
|
281
|
+
end
|
282
|
+
|
283
|
+
def name
|
284
|
+
elements[2]
|
285
|
+
end
|
286
|
+
|
287
|
+
def steps
|
288
|
+
elements[3]
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
module Scenario2
|
293
|
+
def compile(feature)
|
294
|
+
line = input.line_of(interval.first)
|
295
|
+
scenario = feature.add_scenario(name.text_value.strip, line)
|
296
|
+
steps.step_sequence.compile(scenario) if steps.respond_to?(:step_sequence)
|
297
|
+
# TODO - GET RID OF THIS last_scenario NASTINESS
|
298
|
+
# Use a better datastructure, like a linked list...
|
299
|
+
Feature.last_scenario = scenario
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
def _nt_scenario
|
304
|
+
start_index = index
|
305
|
+
if node_cache[:scenario].has_key?(index)
|
306
|
+
cached = node_cache[:scenario][index]
|
307
|
+
@index = cached.interval.end if cached
|
308
|
+
return cached
|
309
|
+
end
|
310
|
+
|
311
|
+
i0, s0 = index, []
|
312
|
+
r1 = _nt_scenario_keyword
|
313
|
+
s0 << r1
|
314
|
+
if r1
|
315
|
+
r3 = _nt_space
|
316
|
+
if r3
|
317
|
+
r2 = r3
|
318
|
+
else
|
319
|
+
r2 = SyntaxNode.new(input, index...index)
|
320
|
+
end
|
321
|
+
s0 << r2
|
322
|
+
if r2
|
323
|
+
r4 = _nt_line_to_eol
|
324
|
+
s0 << r4
|
325
|
+
if r4
|
326
|
+
i6, s6 = index, []
|
327
|
+
r7 = _nt_space
|
328
|
+
s6 << r7
|
329
|
+
if r7
|
330
|
+
r8 = _nt_step_sequence
|
331
|
+
s6 << r8
|
332
|
+
end
|
333
|
+
if s6.last
|
334
|
+
r6 = (SyntaxNode).new(input, i6...index, s6)
|
335
|
+
r6.extend(Scenario0)
|
336
|
+
else
|
337
|
+
self.index = i6
|
338
|
+
r6 = nil
|
339
|
+
end
|
340
|
+
if r6
|
341
|
+
r5 = r6
|
342
|
+
else
|
343
|
+
r5 = SyntaxNode.new(input, index...index)
|
344
|
+
end
|
345
|
+
s0 << r5
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
if s0.last
|
350
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
351
|
+
r0.extend(Scenario1)
|
352
|
+
r0.extend(Scenario2)
|
353
|
+
else
|
354
|
+
self.index = i0
|
355
|
+
r0 = nil
|
356
|
+
end
|
357
|
+
|
358
|
+
node_cache[:scenario][start_index] = r0
|
359
|
+
|
360
|
+
return r0
|
361
|
+
end
|
362
|
+
|
363
|
+
module ScenarioOutline0
|
364
|
+
def scenario_outline_keyword
|
365
|
+
elements[0]
|
366
|
+
end
|
367
|
+
|
368
|
+
def name
|
369
|
+
elements[2]
|
370
|
+
end
|
371
|
+
|
372
|
+
def outline_body
|
373
|
+
elements[3]
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
module ScenarioOutline1
|
378
|
+
def compile(feature)
|
379
|
+
line = input.line_of(interval.first)
|
380
|
+
scenario = feature.add_scenario_outline(name.text_value.strip, line)
|
381
|
+
Feature.last_scenario = scenario
|
382
|
+
outline_body.compile(feature, scenario) if outline_body.respond_to?(:compile)
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
def _nt_scenario_outline
|
387
|
+
start_index = index
|
388
|
+
if node_cache[:scenario_outline].has_key?(index)
|
389
|
+
cached = node_cache[:scenario_outline][index]
|
390
|
+
@index = cached.interval.end if cached
|
391
|
+
return cached
|
392
|
+
end
|
393
|
+
|
394
|
+
i0, s0 = index, []
|
395
|
+
r1 = _nt_scenario_outline_keyword
|
396
|
+
s0 << r1
|
397
|
+
if r1
|
398
|
+
r3 = _nt_space
|
399
|
+
if r3
|
400
|
+
r2 = r3
|
401
|
+
else
|
402
|
+
r2 = SyntaxNode.new(input, index...index)
|
403
|
+
end
|
404
|
+
s0 << r2
|
405
|
+
if r2
|
406
|
+
r4 = _nt_line_to_eol
|
407
|
+
s0 << r4
|
408
|
+
if r4
|
409
|
+
r6 = _nt_steps_and_optional_examples
|
410
|
+
if r6
|
411
|
+
r5 = r6
|
412
|
+
else
|
413
|
+
r5 = SyntaxNode.new(input, index...index)
|
414
|
+
end
|
415
|
+
s0 << r5
|
416
|
+
end
|
417
|
+
end
|
418
|
+
end
|
419
|
+
if s0.last
|
420
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
421
|
+
r0.extend(ScenarioOutline0)
|
422
|
+
r0.extend(ScenarioOutline1)
|
423
|
+
else
|
424
|
+
self.index = i0
|
425
|
+
r0 = nil
|
426
|
+
end
|
427
|
+
|
428
|
+
node_cache[:scenario_outline][start_index] = r0
|
429
|
+
|
430
|
+
return r0
|
431
|
+
end
|
432
|
+
|
433
|
+
def _nt_scenario_or_scenario_outline_or_table
|
434
|
+
start_index = index
|
435
|
+
if node_cache[:scenario_or_scenario_outline_or_table].has_key?(index)
|
436
|
+
cached = node_cache[:scenario_or_scenario_outline_or_table][index]
|
437
|
+
@index = cached.interval.end if cached
|
438
|
+
return cached
|
439
|
+
end
|
440
|
+
|
441
|
+
i0 = index
|
442
|
+
r1 = _nt_scenario_outline
|
443
|
+
if r1
|
444
|
+
r0 = r1
|
445
|
+
else
|
446
|
+
i2 = index
|
447
|
+
r3 = _nt_scenario
|
448
|
+
if r3
|
449
|
+
r2 = r3
|
450
|
+
else
|
451
|
+
r4 = _nt_more_examples
|
452
|
+
if r4
|
453
|
+
r2 = r4
|
454
|
+
else
|
455
|
+
self.index = i2
|
456
|
+
r2 = nil
|
457
|
+
end
|
458
|
+
end
|
459
|
+
if r2
|
460
|
+
r0 = r2
|
461
|
+
else
|
462
|
+
self.index = i0
|
463
|
+
r0 = nil
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
node_cache[:scenario_or_scenario_outline_or_table][start_index] = r0
|
468
|
+
|
469
|
+
return r0
|
470
|
+
end
|
471
|
+
|
472
|
+
module StepsAndOptionalExamples0
|
473
|
+
def space
|
474
|
+
elements[0]
|
475
|
+
end
|
476
|
+
|
477
|
+
def step_sequence
|
478
|
+
elements[1]
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
module StepsAndOptionalExamples1
|
483
|
+
def space
|
484
|
+
elements[0]
|
485
|
+
end
|
486
|
+
|
487
|
+
def examples
|
488
|
+
elements[1]
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
492
|
+
module StepsAndOptionalExamples2
|
493
|
+
def steps
|
494
|
+
elements[0]
|
495
|
+
end
|
496
|
+
|
497
|
+
def table
|
498
|
+
elements[1]
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
module StepsAndOptionalExamples3
|
503
|
+
def compile(feature, scenario)
|
504
|
+
steps.step_sequence.compile(scenario) if steps.respond_to?(:step_sequence)
|
505
|
+
table.examples.compile(feature, scenario) if table.respond_to?(:examples) && table.examples.respond_to?(:compile)
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
509
|
+
def _nt_steps_and_optional_examples
|
510
|
+
start_index = index
|
511
|
+
if node_cache[:steps_and_optional_examples].has_key?(index)
|
512
|
+
cached = node_cache[:steps_and_optional_examples][index]
|
513
|
+
@index = cached.interval.end if cached
|
514
|
+
return cached
|
515
|
+
end
|
516
|
+
|
517
|
+
i0, s0 = index, []
|
518
|
+
i1, s1 = index, []
|
519
|
+
r2 = _nt_space
|
520
|
+
s1 << r2
|
521
|
+
if r2
|
522
|
+
r3 = _nt_step_sequence
|
523
|
+
s1 << r3
|
524
|
+
end
|
525
|
+
if s1.last
|
526
|
+
r1 = (SyntaxNode).new(input, i1...index, s1)
|
527
|
+
r1.extend(StepsAndOptionalExamples0)
|
528
|
+
else
|
529
|
+
self.index = i1
|
530
|
+
r1 = nil
|
531
|
+
end
|
532
|
+
s0 << r1
|
533
|
+
if r1
|
534
|
+
i5, s5 = index, []
|
535
|
+
r6 = _nt_space
|
536
|
+
s5 << r6
|
537
|
+
if r6
|
538
|
+
r7 = _nt_examples
|
539
|
+
s5 << r7
|
540
|
+
end
|
541
|
+
if s5.last
|
542
|
+
r5 = (SyntaxNode).new(input, i5...index, s5)
|
543
|
+
r5.extend(StepsAndOptionalExamples1)
|
544
|
+
else
|
545
|
+
self.index = i5
|
546
|
+
r5 = nil
|
547
|
+
end
|
548
|
+
if r5
|
549
|
+
r4 = r5
|
550
|
+
else
|
551
|
+
r4 = SyntaxNode.new(input, index...index)
|
552
|
+
end
|
553
|
+
s0 << r4
|
554
|
+
end
|
555
|
+
if s0.last
|
556
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
557
|
+
r0.extend(StepsAndOptionalExamples2)
|
558
|
+
r0.extend(StepsAndOptionalExamples3)
|
559
|
+
else
|
560
|
+
self.index = i0
|
561
|
+
r0 = nil
|
562
|
+
end
|
563
|
+
|
564
|
+
node_cache[:steps_and_optional_examples][start_index] = r0
|
565
|
+
|
566
|
+
return r0
|
567
|
+
end
|
568
|
+
|
569
|
+
module MoreExamples0
|
570
|
+
def more_examples_keyword
|
571
|
+
elements[0]
|
572
|
+
end
|
573
|
+
|
574
|
+
def table
|
575
|
+
elements[1]
|
576
|
+
end
|
577
|
+
end
|
578
|
+
|
579
|
+
module MoreExamples1
|
580
|
+
def compile(f)
|
581
|
+
table.compile(f)
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
585
|
+
def _nt_more_examples
|
586
|
+
start_index = index
|
587
|
+
if node_cache[:more_examples].has_key?(index)
|
588
|
+
cached = node_cache[:more_examples][index]
|
589
|
+
@index = cached.interval.end if cached
|
590
|
+
return cached
|
591
|
+
end
|
592
|
+
|
593
|
+
i0, s0 = index, []
|
594
|
+
r1 = _nt_more_examples_keyword
|
595
|
+
s0 << r1
|
596
|
+
if r1
|
597
|
+
r2 = _nt_table
|
598
|
+
s0 << r2
|
599
|
+
end
|
600
|
+
if s0.last
|
601
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
602
|
+
r0.extend(MoreExamples0)
|
603
|
+
r0.extend(MoreExamples1)
|
604
|
+
else
|
605
|
+
self.index = i0
|
606
|
+
r0 = nil
|
607
|
+
end
|
608
|
+
|
609
|
+
node_cache[:more_examples][start_index] = r0
|
610
|
+
|
611
|
+
return r0
|
612
|
+
end
|
613
|
+
|
614
|
+
module Examples0
|
615
|
+
def examples_keyword
|
616
|
+
elements[0]
|
617
|
+
end
|
618
|
+
|
619
|
+
def table
|
620
|
+
elements[1]
|
621
|
+
end
|
622
|
+
end
|
623
|
+
|
624
|
+
module Examples1
|
625
|
+
def compile(feature, scenario)
|
626
|
+
table.compile_examples(feature, scenario)
|
627
|
+
end
|
628
|
+
end
|
629
|
+
|
630
|
+
def _nt_examples
|
631
|
+
start_index = index
|
632
|
+
if node_cache[:examples].has_key?(index)
|
633
|
+
cached = node_cache[:examples][index]
|
634
|
+
@index = cached.interval.end if cached
|
635
|
+
return cached
|
636
|
+
end
|
637
|
+
|
638
|
+
i0, s0 = index, []
|
639
|
+
r1 = _nt_examples_keyword
|
640
|
+
s0 << r1
|
641
|
+
if r1
|
642
|
+
r2 = _nt_table
|
643
|
+
s0 << r2
|
644
|
+
end
|
645
|
+
if s0.last
|
646
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
647
|
+
r0.extend(Examples0)
|
648
|
+
r0.extend(Examples1)
|
649
|
+
else
|
650
|
+
self.index = i0
|
651
|
+
r0 = nil
|
652
|
+
end
|
653
|
+
|
654
|
+
node_cache[:examples][start_index] = r0
|
655
|
+
|
656
|
+
return r0
|
657
|
+
end
|
658
|
+
|
659
|
+
module Table0
|
660
|
+
def eol
|
661
|
+
elements[1]
|
662
|
+
end
|
663
|
+
|
664
|
+
def table_line
|
665
|
+
elements[3]
|
666
|
+
end
|
667
|
+
end
|
668
|
+
|
669
|
+
module Table1
|
670
|
+
def space
|
671
|
+
elements[0]
|
672
|
+
end
|
673
|
+
|
674
|
+
def head
|
675
|
+
elements[1]
|
676
|
+
end
|
677
|
+
|
678
|
+
def body
|
679
|
+
elements[2]
|
680
|
+
end
|
681
|
+
end
|
682
|
+
|
683
|
+
module Table2
|
684
|
+
def compile(feature)
|
685
|
+
Feature.last_scenario.table_header = head.cell_values
|
686
|
+
body.each do |table_line|
|
687
|
+
feature.add_row_scenario(Feature.last_scenario, table_line.cell_values, table_line.line)
|
688
|
+
end
|
689
|
+
end
|
690
|
+
|
691
|
+
def compile_examples(feature, scenario)
|
692
|
+
scenario.table_header = head.cell_values
|
693
|
+
body.each do |table_line|
|
694
|
+
feature.add_row_scenario_outline(scenario, table_line.cell_values, table_line.line)
|
695
|
+
end
|
696
|
+
end
|
697
|
+
|
698
|
+
def matrix
|
699
|
+
([head] + body).map do |table_line|
|
700
|
+
table_line.cell_values # We're losing the line - we'll get it back when we make our own class
|
701
|
+
end
|
702
|
+
end
|
703
|
+
|
704
|
+
def to_arg
|
705
|
+
Model::Table.new(matrix)
|
706
|
+
end
|
707
|
+
|
708
|
+
def body
|
709
|
+
super.elements.map { |elt| elt.table_line }
|
710
|
+
end
|
711
|
+
end
|
712
|
+
|
713
|
+
def _nt_table
|
714
|
+
start_index = index
|
715
|
+
if node_cache[:table].has_key?(index)
|
716
|
+
cached = node_cache[:table][index]
|
717
|
+
@index = cached.interval.end if cached
|
718
|
+
return cached
|
719
|
+
end
|
720
|
+
|
721
|
+
i0, s0 = index, []
|
722
|
+
r1 = _nt_space
|
723
|
+
s0 << r1
|
724
|
+
if r1
|
725
|
+
r2 = _nt_table_line
|
726
|
+
s0 << r2
|
727
|
+
if r2
|
728
|
+
s3, i3 = [], index
|
729
|
+
loop do
|
730
|
+
i4, s4 = index, []
|
731
|
+
s5, i5 = [], index
|
732
|
+
loop do
|
733
|
+
r6 = _nt_blank
|
734
|
+
if r6
|
735
|
+
s5 << r6
|
736
|
+
else
|
737
|
+
break
|
738
|
+
end
|
739
|
+
end
|
740
|
+
r5 = SyntaxNode.new(input, i5...index, s5)
|
741
|
+
s4 << r5
|
742
|
+
if r5
|
743
|
+
r7 = _nt_eol
|
744
|
+
s4 << r7
|
745
|
+
if r7
|
746
|
+
r9 = _nt_space
|
747
|
+
if r9
|
748
|
+
r8 = r9
|
749
|
+
else
|
750
|
+
r8 = SyntaxNode.new(input, index...index)
|
751
|
+
end
|
752
|
+
s4 << r8
|
753
|
+
if r8
|
754
|
+
r10 = _nt_table_line
|
755
|
+
s4 << r10
|
756
|
+
end
|
757
|
+
end
|
758
|
+
end
|
759
|
+
if s4.last
|
760
|
+
r4 = (SyntaxNode).new(input, i4...index, s4)
|
761
|
+
r4.extend(Table0)
|
762
|
+
else
|
763
|
+
self.index = i4
|
764
|
+
r4 = nil
|
765
|
+
end
|
766
|
+
if r4
|
767
|
+
s3 << r4
|
768
|
+
else
|
769
|
+
break
|
770
|
+
end
|
771
|
+
end
|
772
|
+
r3 = SyntaxNode.new(input, i3...index, s3)
|
773
|
+
s0 << r3
|
774
|
+
end
|
775
|
+
end
|
776
|
+
if s0.last
|
777
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
778
|
+
r0.extend(Table1)
|
779
|
+
r0.extend(Table2)
|
780
|
+
else
|
781
|
+
self.index = i0
|
782
|
+
r0 = nil
|
783
|
+
end
|
784
|
+
|
785
|
+
node_cache[:table][start_index] = r0
|
786
|
+
|
787
|
+
return r0
|
788
|
+
end
|
789
|
+
|
790
|
+
module TableLine0
|
791
|
+
def cell_value
|
792
|
+
elements[1]
|
793
|
+
end
|
794
|
+
|
795
|
+
def separator
|
796
|
+
elements[3]
|
797
|
+
end
|
798
|
+
end
|
799
|
+
|
800
|
+
module TableLine1
|
801
|
+
def separator
|
802
|
+
elements[0]
|
803
|
+
end
|
804
|
+
|
805
|
+
def cells
|
806
|
+
elements[1]
|
807
|
+
end
|
808
|
+
end
|
809
|
+
|
810
|
+
module TableLine2
|
811
|
+
def cell_values
|
812
|
+
cells.elements.map { |elt| elt.cell_value.text_value.strip }
|
813
|
+
end
|
814
|
+
|
815
|
+
def line
|
816
|
+
input.line_of(interval.first)
|
817
|
+
end
|
818
|
+
end
|
819
|
+
|
820
|
+
def _nt_table_line
|
821
|
+
start_index = index
|
822
|
+
if node_cache[:table_line].has_key?(index)
|
823
|
+
cached = node_cache[:table_line][index]
|
824
|
+
@index = cached.interval.end if cached
|
825
|
+
return cached
|
826
|
+
end
|
827
|
+
|
828
|
+
i0, s0 = index, []
|
829
|
+
r1 = _nt_separator
|
830
|
+
s0 << r1
|
831
|
+
if r1
|
832
|
+
s2, i2 = [], index
|
833
|
+
loop do
|
834
|
+
i3, s3 = index, []
|
835
|
+
s4, i4 = [], index
|
836
|
+
loop do
|
837
|
+
r5 = _nt_blank
|
838
|
+
if r5
|
839
|
+
s4 << r5
|
840
|
+
else
|
841
|
+
break
|
842
|
+
end
|
843
|
+
end
|
844
|
+
r4 = SyntaxNode.new(input, i4...index, s4)
|
845
|
+
s3 << r4
|
846
|
+
if r4
|
847
|
+
r6 = _nt_cell_value
|
848
|
+
s3 << r6
|
849
|
+
if r6
|
850
|
+
s7, i7 = [], index
|
851
|
+
loop do
|
852
|
+
r8 = _nt_blank
|
853
|
+
if r8
|
854
|
+
s7 << r8
|
855
|
+
else
|
856
|
+
break
|
857
|
+
end
|
858
|
+
end
|
859
|
+
r7 = SyntaxNode.new(input, i7...index, s7)
|
860
|
+
s3 << r7
|
861
|
+
if r7
|
862
|
+
r9 = _nt_separator
|
863
|
+
s3 << r9
|
864
|
+
end
|
865
|
+
end
|
866
|
+
end
|
867
|
+
if s3.last
|
868
|
+
r3 = (SyntaxNode).new(input, i3...index, s3)
|
869
|
+
r3.extend(TableLine0)
|
870
|
+
else
|
871
|
+
self.index = i3
|
872
|
+
r3 = nil
|
873
|
+
end
|
874
|
+
if r3
|
875
|
+
s2 << r3
|
876
|
+
else
|
877
|
+
break
|
878
|
+
end
|
879
|
+
end
|
880
|
+
if s2.empty?
|
881
|
+
self.index = i2
|
882
|
+
r2 = nil
|
883
|
+
else
|
884
|
+
r2 = SyntaxNode.new(input, i2...index, s2)
|
885
|
+
end
|
886
|
+
s0 << r2
|
887
|
+
end
|
888
|
+
if s0.last
|
889
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
890
|
+
r0.extend(TableLine1)
|
891
|
+
r0.extend(TableLine2)
|
892
|
+
else
|
893
|
+
self.index = i0
|
894
|
+
r0 = nil
|
895
|
+
end
|
896
|
+
|
897
|
+
node_cache[:table_line][start_index] = r0
|
898
|
+
|
899
|
+
return r0
|
900
|
+
end
|
901
|
+
|
902
|
+
module CellValue0
|
903
|
+
end
|
904
|
+
|
905
|
+
def _nt_cell_value
|
906
|
+
start_index = index
|
907
|
+
if node_cache[:cell_value].has_key?(index)
|
908
|
+
cached = node_cache[:cell_value][index]
|
909
|
+
@index = cached.interval.end if cached
|
910
|
+
return cached
|
911
|
+
end
|
912
|
+
|
913
|
+
s0, i0 = [], index
|
914
|
+
loop do
|
915
|
+
i1, s1 = index, []
|
916
|
+
i2 = index
|
917
|
+
i3 = index
|
918
|
+
r4 = _nt_separator
|
919
|
+
if r4
|
920
|
+
r3 = r4
|
921
|
+
else
|
922
|
+
r5 = _nt_eol
|
923
|
+
if r5
|
924
|
+
r3 = r5
|
925
|
+
else
|
926
|
+
self.index = i3
|
927
|
+
r3 = nil
|
928
|
+
end
|
929
|
+
end
|
930
|
+
if r3
|
931
|
+
r2 = nil
|
932
|
+
else
|
933
|
+
self.index = i2
|
934
|
+
r2 = SyntaxNode.new(input, index...index)
|
935
|
+
end
|
936
|
+
s1 << r2
|
937
|
+
if r2
|
938
|
+
if index < input_length
|
939
|
+
r6 = (SyntaxNode).new(input, index...(index + 1))
|
940
|
+
@index += 1
|
941
|
+
else
|
942
|
+
terminal_parse_failure("any character")
|
943
|
+
r6 = nil
|
944
|
+
end
|
945
|
+
s1 << r6
|
946
|
+
end
|
947
|
+
if s1.last
|
948
|
+
r1 = (SyntaxNode).new(input, i1...index, s1)
|
949
|
+
r1.extend(CellValue0)
|
950
|
+
else
|
951
|
+
self.index = i1
|
952
|
+
r1 = nil
|
953
|
+
end
|
954
|
+
if r1
|
955
|
+
s0 << r1
|
956
|
+
else
|
957
|
+
break
|
958
|
+
end
|
959
|
+
end
|
960
|
+
r0 = SyntaxNode.new(input, i0...index, s0)
|
961
|
+
|
962
|
+
node_cache[:cell_value][start_index] = r0
|
963
|
+
|
964
|
+
return r0
|
965
|
+
end
|
966
|
+
|
967
|
+
module StepSequence0
|
968
|
+
def space
|
969
|
+
elements[0]
|
970
|
+
end
|
971
|
+
|
972
|
+
def step
|
973
|
+
elements[1]
|
974
|
+
end
|
975
|
+
end
|
976
|
+
|
977
|
+
module StepSequence1
|
978
|
+
def head
|
979
|
+
elements[0]
|
980
|
+
end
|
981
|
+
|
982
|
+
def tail
|
983
|
+
elements[1]
|
984
|
+
end
|
985
|
+
end
|
986
|
+
|
987
|
+
module StepSequence2
|
988
|
+
def compile(scenario)
|
989
|
+
([head] + tail).each do |step|
|
990
|
+
step.compile(scenario)
|
991
|
+
end
|
992
|
+
end
|
993
|
+
|
994
|
+
def tail
|
995
|
+
super.elements.map { |elt| elt.step }
|
996
|
+
end
|
997
|
+
end
|
998
|
+
|
999
|
+
def _nt_step_sequence
|
1000
|
+
start_index = index
|
1001
|
+
if node_cache[:step_sequence].has_key?(index)
|
1002
|
+
cached = node_cache[:step_sequence][index]
|
1003
|
+
@index = cached.interval.end if cached
|
1004
|
+
return cached
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
i0, s0 = index, []
|
1008
|
+
r1 = _nt_step
|
1009
|
+
s0 << r1
|
1010
|
+
if r1
|
1011
|
+
s2, i2 = [], index
|
1012
|
+
loop do
|
1013
|
+
i3, s3 = index, []
|
1014
|
+
r4 = _nt_space
|
1015
|
+
s3 << r4
|
1016
|
+
if r4
|
1017
|
+
r5 = _nt_step
|
1018
|
+
s3 << r5
|
1019
|
+
end
|
1020
|
+
if s3.last
|
1021
|
+
r3 = (SyntaxNode).new(input, i3...index, s3)
|
1022
|
+
r3.extend(StepSequence0)
|
1023
|
+
else
|
1024
|
+
self.index = i3
|
1025
|
+
r3 = nil
|
1026
|
+
end
|
1027
|
+
if r3
|
1028
|
+
s2 << r3
|
1029
|
+
else
|
1030
|
+
break
|
1031
|
+
end
|
1032
|
+
end
|
1033
|
+
r2 = SyntaxNode.new(input, i2...index, s2)
|
1034
|
+
s0 << r2
|
1035
|
+
end
|
1036
|
+
if s0.last
|
1037
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1038
|
+
r0.extend(StepSequence1)
|
1039
|
+
r0.extend(StepSequence2)
|
1040
|
+
else
|
1041
|
+
self.index = i0
|
1042
|
+
r0 = nil
|
1043
|
+
end
|
1044
|
+
|
1045
|
+
node_cache[:step_sequence][start_index] = r0
|
1046
|
+
|
1047
|
+
return r0
|
1048
|
+
end
|
1049
|
+
|
1050
|
+
def _nt_step
|
1051
|
+
start_index = index
|
1052
|
+
if node_cache[:step].has_key?(index)
|
1053
|
+
cached = node_cache[:step][index]
|
1054
|
+
@index = cached.interval.end if cached
|
1055
|
+
return cached
|
1056
|
+
end
|
1057
|
+
|
1058
|
+
i0 = index
|
1059
|
+
r1 = _nt_given_scenario
|
1060
|
+
if r1
|
1061
|
+
r0 = r1
|
1062
|
+
else
|
1063
|
+
r2 = _nt_plain_step
|
1064
|
+
if r2
|
1065
|
+
r0 = r2
|
1066
|
+
else
|
1067
|
+
self.index = i0
|
1068
|
+
r0 = nil
|
1069
|
+
end
|
1070
|
+
end
|
1071
|
+
|
1072
|
+
node_cache[:step][start_index] = r0
|
1073
|
+
|
1074
|
+
return r0
|
1075
|
+
end
|
1076
|
+
|
1077
|
+
module GivenScenario0
|
1078
|
+
def given_scenario_keyword
|
1079
|
+
elements[0]
|
1080
|
+
end
|
1081
|
+
|
1082
|
+
def name
|
1083
|
+
elements[2]
|
1084
|
+
end
|
1085
|
+
end
|
1086
|
+
|
1087
|
+
module GivenScenario1
|
1088
|
+
def compile(scenario)
|
1089
|
+
line = input.line_of(interval.first)
|
1090
|
+
scenario.create_given_scenario(name.text_value.strip, line)
|
1091
|
+
end
|
1092
|
+
end
|
1093
|
+
|
1094
|
+
def _nt_given_scenario
|
1095
|
+
start_index = index
|
1096
|
+
if node_cache[:given_scenario].has_key?(index)
|
1097
|
+
cached = node_cache[:given_scenario][index]
|
1098
|
+
@index = cached.interval.end if cached
|
1099
|
+
return cached
|
1100
|
+
end
|
1101
|
+
|
1102
|
+
i0, s0 = index, []
|
1103
|
+
r1 = _nt_given_scenario_keyword
|
1104
|
+
s0 << r1
|
1105
|
+
if r1
|
1106
|
+
r3 = _nt_space
|
1107
|
+
if r3
|
1108
|
+
r2 = r3
|
1109
|
+
else
|
1110
|
+
r2 = SyntaxNode.new(input, index...index)
|
1111
|
+
end
|
1112
|
+
s0 << r2
|
1113
|
+
if r2
|
1114
|
+
r4 = _nt_line_to_eol
|
1115
|
+
s0 << r4
|
1116
|
+
end
|
1117
|
+
end
|
1118
|
+
if s0.last
|
1119
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1120
|
+
r0.extend(GivenScenario0)
|
1121
|
+
r0.extend(GivenScenario1)
|
1122
|
+
else
|
1123
|
+
self.index = i0
|
1124
|
+
r0 = nil
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
node_cache[:given_scenario][start_index] = r0
|
1128
|
+
|
1129
|
+
return r0
|
1130
|
+
end
|
1131
|
+
|
1132
|
+
module PlainStep0
|
1133
|
+
def step_keyword
|
1134
|
+
elements[0]
|
1135
|
+
end
|
1136
|
+
|
1137
|
+
def name
|
1138
|
+
elements[2]
|
1139
|
+
end
|
1140
|
+
|
1141
|
+
def multi
|
1142
|
+
elements[3]
|
1143
|
+
end
|
1144
|
+
end
|
1145
|
+
|
1146
|
+
module PlainStep1
|
1147
|
+
def compile(scenario)
|
1148
|
+
line = input.line_of(interval.first)
|
1149
|
+
step = scenario.create_step(step_keyword.text_value, name.text_value.strip, line)
|
1150
|
+
|
1151
|
+
if multi.respond_to?(:to_arg)
|
1152
|
+
step.extra_args << multi.to_arg
|
1153
|
+
end
|
1154
|
+
end
|
1155
|
+
end
|
1156
|
+
|
1157
|
+
def _nt_plain_step
|
1158
|
+
start_index = index
|
1159
|
+
if node_cache[:plain_step].has_key?(index)
|
1160
|
+
cached = node_cache[:plain_step][index]
|
1161
|
+
@index = cached.interval.end if cached
|
1162
|
+
return cached
|
1163
|
+
end
|
1164
|
+
|
1165
|
+
i0, s0 = index, []
|
1166
|
+
r1 = _nt_step_keyword
|
1167
|
+
s0 << r1
|
1168
|
+
if r1
|
1169
|
+
r3 = _nt_space
|
1170
|
+
if r3
|
1171
|
+
r2 = r3
|
1172
|
+
else
|
1173
|
+
r2 = SyntaxNode.new(input, index...index)
|
1174
|
+
end
|
1175
|
+
s0 << r2
|
1176
|
+
if r2
|
1177
|
+
r4 = _nt_line_to_eol
|
1178
|
+
s0 << r4
|
1179
|
+
if r4
|
1180
|
+
r6 = _nt_multiline_arg
|
1181
|
+
if r6
|
1182
|
+
r5 = r6
|
1183
|
+
else
|
1184
|
+
r5 = SyntaxNode.new(input, index...index)
|
1185
|
+
end
|
1186
|
+
s0 << r5
|
1187
|
+
end
|
1188
|
+
end
|
1189
|
+
end
|
1190
|
+
if s0.last
|
1191
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1192
|
+
r0.extend(PlainStep0)
|
1193
|
+
r0.extend(PlainStep1)
|
1194
|
+
else
|
1195
|
+
self.index = i0
|
1196
|
+
r0 = nil
|
1197
|
+
end
|
1198
|
+
|
1199
|
+
node_cache[:plain_step][start_index] = r0
|
1200
|
+
|
1201
|
+
return r0
|
1202
|
+
end
|
1203
|
+
|
1204
|
+
def _nt_multiline_arg
|
1205
|
+
start_index = index
|
1206
|
+
if node_cache[:multiline_arg].has_key?(index)
|
1207
|
+
cached = node_cache[:multiline_arg][index]
|
1208
|
+
@index = cached.interval.end if cached
|
1209
|
+
return cached
|
1210
|
+
end
|
1211
|
+
|
1212
|
+
i0 = index
|
1213
|
+
r1 = _nt_table
|
1214
|
+
if r1
|
1215
|
+
r0 = r1
|
1216
|
+
else
|
1217
|
+
r2 = _nt_multiline_string
|
1218
|
+
if r2
|
1219
|
+
r0 = r2
|
1220
|
+
else
|
1221
|
+
self.index = i0
|
1222
|
+
r0 = nil
|
1223
|
+
end
|
1224
|
+
end
|
1225
|
+
|
1226
|
+
node_cache[:multiline_arg][start_index] = r0
|
1227
|
+
|
1228
|
+
return r0
|
1229
|
+
end
|
1230
|
+
|
1231
|
+
module MultilineString0
|
1232
|
+
end
|
1233
|
+
|
1234
|
+
module MultilineString1
|
1235
|
+
def eol
|
1236
|
+
elements[0]
|
1237
|
+
end
|
1238
|
+
|
1239
|
+
def indent
|
1240
|
+
elements[1]
|
1241
|
+
end
|
1242
|
+
|
1243
|
+
def triple_quote
|
1244
|
+
elements[2]
|
1245
|
+
end
|
1246
|
+
|
1247
|
+
def string
|
1248
|
+
elements[3]
|
1249
|
+
end
|
1250
|
+
|
1251
|
+
def triple_quote
|
1252
|
+
elements[4]
|
1253
|
+
end
|
1254
|
+
end
|
1255
|
+
|
1256
|
+
module MultilineString2
|
1257
|
+
def to_arg
|
1258
|
+
indent_length = indent.text_value.length
|
1259
|
+
significant_lines = string.text_value.split("\n")[1..-2]
|
1260
|
+
significant_lines.map do |l|
|
1261
|
+
l[indent_length..-1]
|
1262
|
+
end.join("\n")
|
1263
|
+
end
|
1264
|
+
end
|
1265
|
+
|
1266
|
+
def _nt_multiline_string
|
1267
|
+
start_index = index
|
1268
|
+
if node_cache[:multiline_string].has_key?(index)
|
1269
|
+
cached = node_cache[:multiline_string][index]
|
1270
|
+
@index = cached.interval.end if cached
|
1271
|
+
return cached
|
1272
|
+
end
|
1273
|
+
|
1274
|
+
i0, s0 = index, []
|
1275
|
+
r1 = _nt_eol
|
1276
|
+
s0 << r1
|
1277
|
+
if r1
|
1278
|
+
r2 = _nt_space
|
1279
|
+
s0 << r2
|
1280
|
+
if r2
|
1281
|
+
r3 = _nt_triple_quote
|
1282
|
+
s0 << r3
|
1283
|
+
if r3
|
1284
|
+
s4, i4 = [], index
|
1285
|
+
loop do
|
1286
|
+
i5, s5 = index, []
|
1287
|
+
i6 = index
|
1288
|
+
r7 = _nt_triple_quote
|
1289
|
+
if r7
|
1290
|
+
r6 = nil
|
1291
|
+
else
|
1292
|
+
self.index = i6
|
1293
|
+
r6 = SyntaxNode.new(input, index...index)
|
1294
|
+
end
|
1295
|
+
s5 << r6
|
1296
|
+
if r6
|
1297
|
+
if index < input_length
|
1298
|
+
r8 = (SyntaxNode).new(input, index...(index + 1))
|
1299
|
+
@index += 1
|
1300
|
+
else
|
1301
|
+
terminal_parse_failure("any character")
|
1302
|
+
r8 = nil
|
1303
|
+
end
|
1304
|
+
s5 << r8
|
1305
|
+
end
|
1306
|
+
if s5.last
|
1307
|
+
r5 = (SyntaxNode).new(input, i5...index, s5)
|
1308
|
+
r5.extend(MultilineString0)
|
1309
|
+
else
|
1310
|
+
self.index = i5
|
1311
|
+
r5 = nil
|
1312
|
+
end
|
1313
|
+
if r5
|
1314
|
+
s4 << r5
|
1315
|
+
else
|
1316
|
+
break
|
1317
|
+
end
|
1318
|
+
end
|
1319
|
+
r4 = SyntaxNode.new(input, i4...index, s4)
|
1320
|
+
s0 << r4
|
1321
|
+
if r4
|
1322
|
+
r9 = _nt_triple_quote
|
1323
|
+
s0 << r9
|
1324
|
+
end
|
1325
|
+
end
|
1326
|
+
end
|
1327
|
+
end
|
1328
|
+
if s0.last
|
1329
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1330
|
+
r0.extend(MultilineString1)
|
1331
|
+
r0.extend(MultilineString2)
|
1332
|
+
else
|
1333
|
+
self.index = i0
|
1334
|
+
r0 = nil
|
1335
|
+
end
|
1336
|
+
|
1337
|
+
node_cache[:multiline_string][start_index] = r0
|
1338
|
+
|
1339
|
+
return r0
|
1340
|
+
end
|
1341
|
+
|
1342
|
+
def _nt_triple_quote
|
1343
|
+
start_index = index
|
1344
|
+
if node_cache[:triple_quote].has_key?(index)
|
1345
|
+
cached = node_cache[:triple_quote][index]
|
1346
|
+
@index = cached.interval.end if cached
|
1347
|
+
return cached
|
1348
|
+
end
|
1349
|
+
|
1350
|
+
if input.index('"""', index) == index
|
1351
|
+
r0 = (SyntaxNode).new(input, index...(index + 3))
|
1352
|
+
@index += 3
|
1353
|
+
else
|
1354
|
+
terminal_parse_failure('"""')
|
1355
|
+
r0 = nil
|
1356
|
+
end
|
1357
|
+
|
1358
|
+
node_cache[:triple_quote][start_index] = r0
|
1359
|
+
|
1360
|
+
return r0
|
1361
|
+
end
|
1362
|
+
|
1363
|
+
def _nt_separator
|
1364
|
+
start_index = index
|
1365
|
+
if node_cache[:separator].has_key?(index)
|
1366
|
+
cached = node_cache[:separator][index]
|
1367
|
+
@index = cached.interval.end if cached
|
1368
|
+
return cached
|
1369
|
+
end
|
1370
|
+
|
1371
|
+
if input.index('|', index) == index
|
1372
|
+
r0 = (SyntaxNode).new(input, index...(index + 1))
|
1373
|
+
@index += 1
|
1374
|
+
else
|
1375
|
+
terminal_parse_failure('|')
|
1376
|
+
r0 = nil
|
1377
|
+
end
|
1378
|
+
|
1379
|
+
node_cache[:separator][start_index] = r0
|
1380
|
+
|
1381
|
+
return r0
|
1382
|
+
end
|
1383
|
+
|
1384
|
+
def _nt_space
|
1385
|
+
start_index = index
|
1386
|
+
if node_cache[:space].has_key?(index)
|
1387
|
+
cached = node_cache[:space][index]
|
1388
|
+
@index = cached.interval.end if cached
|
1389
|
+
return cached
|
1390
|
+
end
|
1391
|
+
|
1392
|
+
s0, i0 = [], index
|
1393
|
+
loop do
|
1394
|
+
i1 = index
|
1395
|
+
r2 = _nt_white
|
1396
|
+
if r2
|
1397
|
+
r1 = r2
|
1398
|
+
else
|
1399
|
+
r3 = _nt_comment_to_eol
|
1400
|
+
if r3
|
1401
|
+
r1 = r3
|
1402
|
+
else
|
1403
|
+
self.index = i1
|
1404
|
+
r1 = nil
|
1405
|
+
end
|
1406
|
+
end
|
1407
|
+
if r1
|
1408
|
+
s0 << r1
|
1409
|
+
else
|
1410
|
+
break
|
1411
|
+
end
|
1412
|
+
end
|
1413
|
+
if s0.empty?
|
1414
|
+
self.index = i0
|
1415
|
+
r0 = nil
|
1416
|
+
else
|
1417
|
+
r0 = SyntaxNode.new(input, i0...index, s0)
|
1418
|
+
end
|
1419
|
+
|
1420
|
+
node_cache[:space][start_index] = r0
|
1421
|
+
|
1422
|
+
return r0
|
1423
|
+
end
|
1424
|
+
|
1425
|
+
module LineToEol0
|
1426
|
+
end
|
1427
|
+
|
1428
|
+
def _nt_line_to_eol
|
1429
|
+
start_index = index
|
1430
|
+
if node_cache[:line_to_eol].has_key?(index)
|
1431
|
+
cached = node_cache[:line_to_eol][index]
|
1432
|
+
@index = cached.interval.end if cached
|
1433
|
+
return cached
|
1434
|
+
end
|
1435
|
+
|
1436
|
+
s0, i0 = [], index
|
1437
|
+
loop do
|
1438
|
+
i1, s1 = index, []
|
1439
|
+
i2 = index
|
1440
|
+
r3 = _nt_eol
|
1441
|
+
if r3
|
1442
|
+
r2 = nil
|
1443
|
+
else
|
1444
|
+
self.index = i2
|
1445
|
+
r2 = SyntaxNode.new(input, index...index)
|
1446
|
+
end
|
1447
|
+
s1 << r2
|
1448
|
+
if r2
|
1449
|
+
if index < input_length
|
1450
|
+
r4 = (SyntaxNode).new(input, index...(index + 1))
|
1451
|
+
@index += 1
|
1452
|
+
else
|
1453
|
+
terminal_parse_failure("any character")
|
1454
|
+
r4 = nil
|
1455
|
+
end
|
1456
|
+
s1 << r4
|
1457
|
+
end
|
1458
|
+
if s1.last
|
1459
|
+
r1 = (SyntaxNode).new(input, i1...index, s1)
|
1460
|
+
r1.extend(LineToEol0)
|
1461
|
+
else
|
1462
|
+
self.index = i1
|
1463
|
+
r1 = nil
|
1464
|
+
end
|
1465
|
+
if r1
|
1466
|
+
s0 << r1
|
1467
|
+
else
|
1468
|
+
break
|
1469
|
+
end
|
1470
|
+
end
|
1471
|
+
r0 = SyntaxNode.new(input, i0...index, s0)
|
1472
|
+
|
1473
|
+
node_cache[:line_to_eol][start_index] = r0
|
1474
|
+
|
1475
|
+
return r0
|
1476
|
+
end
|
1477
|
+
|
1478
|
+
module CommentToEol0
|
1479
|
+
def line_to_eol
|
1480
|
+
elements[1]
|
1481
|
+
end
|
1482
|
+
end
|
1483
|
+
|
1484
|
+
def _nt_comment_to_eol
|
1485
|
+
start_index = index
|
1486
|
+
if node_cache[:comment_to_eol].has_key?(index)
|
1487
|
+
cached = node_cache[:comment_to_eol][index]
|
1488
|
+
@index = cached.interval.end if cached
|
1489
|
+
return cached
|
1490
|
+
end
|
1491
|
+
|
1492
|
+
i0, s0 = index, []
|
1493
|
+
if input.index('#', index) == index
|
1494
|
+
r1 = (SyntaxNode).new(input, index...(index + 1))
|
1495
|
+
@index += 1
|
1496
|
+
else
|
1497
|
+
terminal_parse_failure('#')
|
1498
|
+
r1 = nil
|
1499
|
+
end
|
1500
|
+
s0 << r1
|
1501
|
+
if r1
|
1502
|
+
r2 = _nt_line_to_eol
|
1503
|
+
s0 << r2
|
1504
|
+
end
|
1505
|
+
if s0.last
|
1506
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1507
|
+
r0.extend(CommentToEol0)
|
1508
|
+
else
|
1509
|
+
self.index = i0
|
1510
|
+
r0 = nil
|
1511
|
+
end
|
1512
|
+
|
1513
|
+
node_cache[:comment_to_eol][start_index] = r0
|
1514
|
+
|
1515
|
+
return r0
|
1516
|
+
end
|
1517
|
+
|
1518
|
+
def _nt_white
|
1519
|
+
start_index = index
|
1520
|
+
if node_cache[:white].has_key?(index)
|
1521
|
+
cached = node_cache[:white][index]
|
1522
|
+
@index = cached.interval.end if cached
|
1523
|
+
return cached
|
1524
|
+
end
|
1525
|
+
|
1526
|
+
i0 = index
|
1527
|
+
r1 = _nt_blank
|
1528
|
+
if r1
|
1529
|
+
r0 = r1
|
1530
|
+
else
|
1531
|
+
r2 = _nt_eol
|
1532
|
+
if r2
|
1533
|
+
r0 = r2
|
1534
|
+
else
|
1535
|
+
self.index = i0
|
1536
|
+
r0 = nil
|
1537
|
+
end
|
1538
|
+
end
|
1539
|
+
|
1540
|
+
node_cache[:white][start_index] = r0
|
1541
|
+
|
1542
|
+
return r0
|
1543
|
+
end
|
1544
|
+
|
1545
|
+
def _nt_blank
|
1546
|
+
start_index = index
|
1547
|
+
if node_cache[:blank].has_key?(index)
|
1548
|
+
cached = node_cache[:blank][index]
|
1549
|
+
@index = cached.interval.end if cached
|
1550
|
+
return cached
|
1551
|
+
end
|
1552
|
+
|
1553
|
+
if input.index(Regexp.new('[ \\t]'), index) == index
|
1554
|
+
r0 = (SyntaxNode).new(input, index...(index + 1))
|
1555
|
+
@index += 1
|
1556
|
+
else
|
1557
|
+
r0 = nil
|
1558
|
+
end
|
1559
|
+
|
1560
|
+
node_cache[:blank][start_index] = r0
|
1561
|
+
|
1562
|
+
return r0
|
1563
|
+
end
|
1564
|
+
|
1565
|
+
module Eol0
|
1566
|
+
end
|
1567
|
+
|
1568
|
+
def _nt_eol
|
1569
|
+
start_index = index
|
1570
|
+
if node_cache[:eol].has_key?(index)
|
1571
|
+
cached = node_cache[:eol][index]
|
1572
|
+
@index = cached.interval.end if cached
|
1573
|
+
return cached
|
1574
|
+
end
|
1575
|
+
|
1576
|
+
i0 = index
|
1577
|
+
i1, s1 = index, []
|
1578
|
+
if input.index("\r", index) == index
|
1579
|
+
r2 = (SyntaxNode).new(input, index...(index + 1))
|
1580
|
+
@index += 1
|
1581
|
+
else
|
1582
|
+
terminal_parse_failure("\r")
|
1583
|
+
r2 = nil
|
1584
|
+
end
|
1585
|
+
s1 << r2
|
1586
|
+
if r2
|
1587
|
+
if input.index("\n", index) == index
|
1588
|
+
r4 = (SyntaxNode).new(input, index...(index + 1))
|
1589
|
+
@index += 1
|
1590
|
+
else
|
1591
|
+
terminal_parse_failure("\n")
|
1592
|
+
r4 = nil
|
1593
|
+
end
|
1594
|
+
if r4
|
1595
|
+
r3 = r4
|
1596
|
+
else
|
1597
|
+
r3 = SyntaxNode.new(input, index...index)
|
1598
|
+
end
|
1599
|
+
s1 << r3
|
1600
|
+
end
|
1601
|
+
if s1.last
|
1602
|
+
r1 = (SyntaxNode).new(input, i1...index, s1)
|
1603
|
+
r1.extend(Eol0)
|
1604
|
+
else
|
1605
|
+
self.index = i1
|
1606
|
+
r1 = nil
|
1607
|
+
end
|
1608
|
+
if r1
|
1609
|
+
r0 = r1
|
1610
|
+
else
|
1611
|
+
if input.index("\n", index) == index
|
1612
|
+
r5 = (SyntaxNode).new(input, index...(index + 1))
|
1613
|
+
@index += 1
|
1614
|
+
else
|
1615
|
+
terminal_parse_failure("\n")
|
1616
|
+
r5 = nil
|
1617
|
+
end
|
1618
|
+
if r5
|
1619
|
+
r0 = r5
|
1620
|
+
else
|
1621
|
+
self.index = i0
|
1622
|
+
r0 = nil
|
1623
|
+
end
|
1624
|
+
end
|
1625
|
+
|
1626
|
+
node_cache[:eol][start_index] = r0
|
1627
|
+
|
1628
|
+
return r0
|
1629
|
+
end
|
1630
|
+
|
1631
|
+
def _nt_step_keyword
|
1632
|
+
start_index = index
|
1633
|
+
if node_cache[:step_keyword].has_key?(index)
|
1634
|
+
cached = node_cache[:step_keyword][index]
|
1635
|
+
@index = cached.interval.end if cached
|
1636
|
+
return cached
|
1637
|
+
end
|
1638
|
+
|
1639
|
+
i0 = index
|
1640
|
+
if input.index("조건", index) == index
|
1641
|
+
r1 = (SyntaxNode).new(input, index...(index + 6))
|
1642
|
+
@index += 6
|
1643
|
+
else
|
1644
|
+
terminal_parse_failure("조건")
|
1645
|
+
r1 = nil
|
1646
|
+
end
|
1647
|
+
if r1
|
1648
|
+
r0 = r1
|
1649
|
+
else
|
1650
|
+
if input.index("만일", index) == index
|
1651
|
+
r2 = (SyntaxNode).new(input, index...(index + 6))
|
1652
|
+
@index += 6
|
1653
|
+
else
|
1654
|
+
terminal_parse_failure("만일")
|
1655
|
+
r2 = nil
|
1656
|
+
end
|
1657
|
+
if r2
|
1658
|
+
r0 = r2
|
1659
|
+
else
|
1660
|
+
if input.index("그러면", index) == index
|
1661
|
+
r3 = (SyntaxNode).new(input, index...(index + 9))
|
1662
|
+
@index += 9
|
1663
|
+
else
|
1664
|
+
terminal_parse_failure("그러면")
|
1665
|
+
r3 = nil
|
1666
|
+
end
|
1667
|
+
if r3
|
1668
|
+
r0 = r3
|
1669
|
+
else
|
1670
|
+
if input.index("그리고", index) == index
|
1671
|
+
r4 = (SyntaxNode).new(input, index...(index + 9))
|
1672
|
+
@index += 9
|
1673
|
+
else
|
1674
|
+
terminal_parse_failure("그리고")
|
1675
|
+
r4 = nil
|
1676
|
+
end
|
1677
|
+
if r4
|
1678
|
+
r0 = r4
|
1679
|
+
else
|
1680
|
+
if input.index("하지만", index) == index
|
1681
|
+
r5 = (SyntaxNode).new(input, index...(index + 9))
|
1682
|
+
@index += 9
|
1683
|
+
else
|
1684
|
+
terminal_parse_failure("하지만")
|
1685
|
+
r5 = nil
|
1686
|
+
end
|
1687
|
+
if r5
|
1688
|
+
r0 = r5
|
1689
|
+
else
|
1690
|
+
self.index = i0
|
1691
|
+
r0 = nil
|
1692
|
+
end
|
1693
|
+
end
|
1694
|
+
end
|
1695
|
+
end
|
1696
|
+
end
|
1697
|
+
|
1698
|
+
node_cache[:step_keyword][start_index] = r0
|
1699
|
+
|
1700
|
+
return r0
|
1701
|
+
end
|
1702
|
+
|
1703
|
+
module ScenarioKeyword0
|
1704
|
+
end
|
1705
|
+
|
1706
|
+
def _nt_scenario_keyword
|
1707
|
+
start_index = index
|
1708
|
+
if node_cache[:scenario_keyword].has_key?(index)
|
1709
|
+
cached = node_cache[:scenario_keyword][index]
|
1710
|
+
@index = cached.interval.end if cached
|
1711
|
+
return cached
|
1712
|
+
end
|
1713
|
+
|
1714
|
+
i0, s0 = index, []
|
1715
|
+
if input.index("예", index) == index
|
1716
|
+
r1 = (SyntaxNode).new(input, index...(index + 3))
|
1717
|
+
@index += 3
|
1718
|
+
else
|
1719
|
+
terminal_parse_failure("예")
|
1720
|
+
r1 = nil
|
1721
|
+
end
|
1722
|
+
s0 << r1
|
1723
|
+
if r1
|
1724
|
+
if input.index(":", index) == index
|
1725
|
+
r3 = (SyntaxNode).new(input, index...(index + 1))
|
1726
|
+
@index += 1
|
1727
|
+
else
|
1728
|
+
terminal_parse_failure(":")
|
1729
|
+
r3 = nil
|
1730
|
+
end
|
1731
|
+
if r3
|
1732
|
+
r2 = r3
|
1733
|
+
else
|
1734
|
+
r2 = SyntaxNode.new(input, index...index)
|
1735
|
+
end
|
1736
|
+
s0 << r2
|
1737
|
+
end
|
1738
|
+
if s0.last
|
1739
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1740
|
+
r0.extend(ScenarioKeyword0)
|
1741
|
+
else
|
1742
|
+
self.index = i0
|
1743
|
+
r0 = nil
|
1744
|
+
end
|
1745
|
+
|
1746
|
+
node_cache[:scenario_keyword][start_index] = r0
|
1747
|
+
|
1748
|
+
return r0
|
1749
|
+
end
|
1750
|
+
|
1751
|
+
module ScenarioOutlineKeyword0
|
1752
|
+
end
|
1753
|
+
|
1754
|
+
def _nt_scenario_outline_keyword
|
1755
|
+
start_index = index
|
1756
|
+
if node_cache[:scenario_outline_keyword].has_key?(index)
|
1757
|
+
cached = node_cache[:scenario_outline_keyword][index]
|
1758
|
+
@index = cached.interval.end if cached
|
1759
|
+
return cached
|
1760
|
+
end
|
1761
|
+
|
1762
|
+
i0, s0 = index, []
|
1763
|
+
if input.index("Scenario Outline", index) == index
|
1764
|
+
r1 = (SyntaxNode).new(input, index...(index + 16))
|
1765
|
+
@index += 16
|
1766
|
+
else
|
1767
|
+
terminal_parse_failure("Scenario Outline")
|
1768
|
+
r1 = nil
|
1769
|
+
end
|
1770
|
+
s0 << r1
|
1771
|
+
if r1
|
1772
|
+
if input.index(":", index) == index
|
1773
|
+
r3 = (SyntaxNode).new(input, index...(index + 1))
|
1774
|
+
@index += 1
|
1775
|
+
else
|
1776
|
+
terminal_parse_failure(":")
|
1777
|
+
r3 = nil
|
1778
|
+
end
|
1779
|
+
if r3
|
1780
|
+
r2 = r3
|
1781
|
+
else
|
1782
|
+
r2 = SyntaxNode.new(input, index...index)
|
1783
|
+
end
|
1784
|
+
s0 << r2
|
1785
|
+
end
|
1786
|
+
if s0.last
|
1787
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1788
|
+
r0.extend(ScenarioOutlineKeyword0)
|
1789
|
+
else
|
1790
|
+
self.index = i0
|
1791
|
+
r0 = nil
|
1792
|
+
end
|
1793
|
+
|
1794
|
+
node_cache[:scenario_outline_keyword][start_index] = r0
|
1795
|
+
|
1796
|
+
return r0
|
1797
|
+
end
|
1798
|
+
|
1799
|
+
module MoreExamplesKeyword0
|
1800
|
+
end
|
1801
|
+
|
1802
|
+
def _nt_more_examples_keyword
|
1803
|
+
start_index = index
|
1804
|
+
if node_cache[:more_examples_keyword].has_key?(index)
|
1805
|
+
cached = node_cache[:more_examples_keyword][index]
|
1806
|
+
@index = cached.interval.end if cached
|
1807
|
+
return cached
|
1808
|
+
end
|
1809
|
+
|
1810
|
+
i0, s0 = index, []
|
1811
|
+
if input.index("다른 예", index) == index
|
1812
|
+
r1 = (SyntaxNode).new(input, index...(index + 10))
|
1813
|
+
@index += 10
|
1814
|
+
else
|
1815
|
+
terminal_parse_failure("다른 예")
|
1816
|
+
r1 = nil
|
1817
|
+
end
|
1818
|
+
s0 << r1
|
1819
|
+
if r1
|
1820
|
+
if input.index(":", index) == index
|
1821
|
+
r3 = (SyntaxNode).new(input, index...(index + 1))
|
1822
|
+
@index += 1
|
1823
|
+
else
|
1824
|
+
terminal_parse_failure(":")
|
1825
|
+
r3 = nil
|
1826
|
+
end
|
1827
|
+
if r3
|
1828
|
+
r2 = r3
|
1829
|
+
else
|
1830
|
+
r2 = SyntaxNode.new(input, index...index)
|
1831
|
+
end
|
1832
|
+
s0 << r2
|
1833
|
+
end
|
1834
|
+
if s0.last
|
1835
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1836
|
+
r0.extend(MoreExamplesKeyword0)
|
1837
|
+
else
|
1838
|
+
self.index = i0
|
1839
|
+
r0 = nil
|
1840
|
+
end
|
1841
|
+
|
1842
|
+
node_cache[:more_examples_keyword][start_index] = r0
|
1843
|
+
|
1844
|
+
return r0
|
1845
|
+
end
|
1846
|
+
|
1847
|
+
module ExamplesKeyword0
|
1848
|
+
end
|
1849
|
+
|
1850
|
+
def _nt_examples_keyword
|
1851
|
+
start_index = index
|
1852
|
+
if node_cache[:examples_keyword].has_key?(index)
|
1853
|
+
cached = node_cache[:examples_keyword][index]
|
1854
|
+
@index = cached.interval.end if cached
|
1855
|
+
return cached
|
1856
|
+
end
|
1857
|
+
|
1858
|
+
i0, s0 = index, []
|
1859
|
+
if input.index("Examples", index) == index
|
1860
|
+
r1 = (SyntaxNode).new(input, index...(index + 8))
|
1861
|
+
@index += 8
|
1862
|
+
else
|
1863
|
+
terminal_parse_failure("Examples")
|
1864
|
+
r1 = nil
|
1865
|
+
end
|
1866
|
+
s0 << r1
|
1867
|
+
if r1
|
1868
|
+
if input.index(":", index) == index
|
1869
|
+
r3 = (SyntaxNode).new(input, index...(index + 1))
|
1870
|
+
@index += 1
|
1871
|
+
else
|
1872
|
+
terminal_parse_failure(":")
|
1873
|
+
r3 = nil
|
1874
|
+
end
|
1875
|
+
if r3
|
1876
|
+
r2 = r3
|
1877
|
+
else
|
1878
|
+
r2 = SyntaxNode.new(input, index...index)
|
1879
|
+
end
|
1880
|
+
s0 << r2
|
1881
|
+
end
|
1882
|
+
if s0.last
|
1883
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1884
|
+
r0.extend(ExamplesKeyword0)
|
1885
|
+
else
|
1886
|
+
self.index = i0
|
1887
|
+
r0 = nil
|
1888
|
+
end
|
1889
|
+
|
1890
|
+
node_cache[:examples_keyword][start_index] = r0
|
1891
|
+
|
1892
|
+
return r0
|
1893
|
+
end
|
1894
|
+
|
1895
|
+
module GivenScenarioKeyword0
|
1896
|
+
end
|
1897
|
+
|
1898
|
+
def _nt_given_scenario_keyword
|
1899
|
+
start_index = index
|
1900
|
+
if node_cache[:given_scenario_keyword].has_key?(index)
|
1901
|
+
cached = node_cache[:given_scenario_keyword][index]
|
1902
|
+
@index = cached.interval.end if cached
|
1903
|
+
return cached
|
1904
|
+
end
|
1905
|
+
|
1906
|
+
i0, s0 = index, []
|
1907
|
+
if input.index("주어진 예", index) == index
|
1908
|
+
r1 = (SyntaxNode).new(input, index...(index + 13))
|
1909
|
+
@index += 13
|
1910
|
+
else
|
1911
|
+
terminal_parse_failure("주어진 예")
|
1912
|
+
r1 = nil
|
1913
|
+
end
|
1914
|
+
s0 << r1
|
1915
|
+
if r1
|
1916
|
+
if input.index(":", index) == index
|
1917
|
+
r3 = (SyntaxNode).new(input, index...(index + 1))
|
1918
|
+
@index += 1
|
1919
|
+
else
|
1920
|
+
terminal_parse_failure(":")
|
1921
|
+
r3 = nil
|
1922
|
+
end
|
1923
|
+
if r3
|
1924
|
+
r2 = r3
|
1925
|
+
else
|
1926
|
+
r2 = SyntaxNode.new(input, index...index)
|
1927
|
+
end
|
1928
|
+
s0 << r2
|
1929
|
+
end
|
1930
|
+
if s0.last
|
1931
|
+
r0 = (SyntaxNode).new(input, i0...index, s0)
|
1932
|
+
r0.extend(GivenScenarioKeyword0)
|
1933
|
+
else
|
1934
|
+
self.index = i0
|
1935
|
+
r0 = nil
|
1936
|
+
end
|
1937
|
+
|
1938
|
+
node_cache[:given_scenario_keyword][start_index] = r0
|
1939
|
+
|
1940
|
+
return r0
|
1941
|
+
end
|
1942
|
+
|
1943
|
+
end
|
1944
|
+
|
1945
|
+
class FeatureParser < Treetop::Runtime::CompiledParser
|
1946
|
+
include Feature
|
1947
|
+
end
|
1948
|
+
|
1949
|
+
|
1950
|
+
end
|
1951
|
+
end
|